diff --git a/src/Buffer.ts b/src/Buffer.ts index 58cf8a8e..9a28438d 100644 --- a/src/Buffer.ts +++ b/src/Buffer.ts @@ -4,6 +4,7 @@ import { ITerminal, IBuffer } from './Interfaces'; import { CircularList } from './utils/CircularList'; +import { LineData, CharData } from './Types'; /** * This class represents a terminal buffer (an internal state of the terminal), where the @@ -13,7 +14,7 @@ import { CircularList } from './utils/CircularList'; * - scroll position */ export class Buffer implements IBuffer { - private _lines: CircularList<[number, string, number][]>; + private _lines: CircularList; public ydisp: number; public ybase: number; @@ -39,7 +40,7 @@ export class Buffer implements IBuffer { this.clear(); } - public get lines(): CircularList<[number, string, number][]> { + public get lines(): CircularList { return this._lines; } @@ -60,7 +61,7 @@ export class Buffer implements IBuffer { this.scrollBottom = 0; this.scrollTop = 0; this.tabs = {}; - this._lines = new CircularList<[number, string, number][]>(this._terminal.options.scrollback); + this._lines = new CircularList(this._terminal.options.scrollback); this.scrollBottom = this._terminal.rows - 1; } @@ -72,7 +73,7 @@ export class Buffer implements IBuffer { // Deal with columns increasing (we don't do anything when columns reduce) if (this._terminal.cols < newCols) { - const ch: [number, string, number] = [this._terminal.defAttr, ' ', 1]; // does xterm use the default attr? + const ch: CharData = [this._terminal.defAttr, ' ', 1]; // does xterm use the default attr? for (let i = 0; i < this._lines.length; i++) { if (this._lines.get(i) === undefined) { this._lines.set(i, this._terminal.blankLine()); diff --git a/src/InputHandler.ts b/src/InputHandler.ts index 2b4d01d0..91160134 100644 --- a/src/InputHandler.ts +++ b/src/InputHandler.ts @@ -5,6 +5,7 @@ import { IInputHandler, ITerminal, IInputHandlingTerminal } from './Interfaces'; import { C0 } from './EscapeSequences'; import { DEFAULT_CHARSET } from './Charsets'; +import { CharData } from './Types'; /** * The terminal's standard implementation of IInputHandler, this handles all @@ -194,7 +195,7 @@ export class InputHandler implements IInputHandler { const row = this._terminal.buffer.y + this._terminal.buffer.ybase; let j = this._terminal.buffer.x; - const ch: [number, string, number] = [this._terminal.eraseAttr(), ' ', 1]; // xterm + const ch: CharData = [this._terminal.eraseAttr(), ' ', 1]; // xterm while (param-- && j < this._terminal.cols) { this._terminal.buffer.lines.get(row).splice(j++, 0, ch); @@ -510,7 +511,7 @@ export class InputHandler implements IInputHandler { } const row = this._terminal.buffer.y + this._terminal.buffer.ybase; - const ch: [number, string, number] = [this._terminal.eraseAttr(), ' ', 1]; // xterm + const ch: CharData = [this._terminal.eraseAttr(), ' ', 1]; // xterm while (param--) { this._terminal.buffer.lines.get(row).splice(this._terminal.buffer.x, 1); @@ -558,7 +559,7 @@ export class InputHandler implements IInputHandler { const row = this._terminal.buffer.y + this._terminal.buffer.ybase; let j = this._terminal.buffer.x; - const ch: [number, string, number] = [this._terminal.eraseAttr(), ' ', 1]; // xterm + const ch: CharData = [this._terminal.eraseAttr(), ' ', 1]; // xterm while (param-- && j < this._terminal.cols) { this._terminal.buffer.lines.get(row)[j++] = ch; diff --git a/src/Interfaces.ts b/src/Interfaces.ts index 506032a1..63058f09 100644 --- a/src/Interfaces.ts +++ b/src/Interfaces.ts @@ -3,7 +3,7 @@ */ import { ILinkMatcherOptions } from './Interfaces'; -import { LinkMatcherHandler, LinkMatcherValidationCallback, Charset } from './Types'; +import { LinkMatcherHandler, LinkMatcherValidationCallback, Charset, LineData } from './Types'; export interface IBrowser { isNode: boolean; @@ -46,7 +46,7 @@ export interface ITerminal extends IEventEmitter { log(text: string): void; reset(): void; showCursor(): void; - blankLine(cur?: boolean, isWrapped?: boolean): [number, string, number]; + blankLine(cur?: boolean, isWrapped?: boolean): LineData; } /** @@ -97,7 +97,7 @@ export interface IInputHandlingTerminal extends IEventEmitter { eraseRight(x: number, y: number): void; eraseLine(y: number): void; eraseLeft(x: number, y: number): void; - blankLine(cur?: boolean, isWrapped?: boolean): [number, string, number][]; + blankLine(cur?: boolean, isWrapped?: boolean): LineData; prevStop(x?: number): number; is(term: string): boolean; send(data: string): void; @@ -134,7 +134,7 @@ export interface ITerminalOptions { } export interface IBuffer { - lines: ICircularList<[number, string, number][]>; + lines: ICircularList; ydisp: number; ybase: number; y: number; @@ -166,7 +166,7 @@ export interface ISelectionManager { disable(): void; enable(): void; - setBuffer(buffer: ICircularList<[number, string, number][]>): void; + setBuffer(buffer: ICircularList): void; setSelection(row: number, col: number, length: number): void; } diff --git a/src/SelectionManager.test.ts b/src/SelectionManager.test.ts index f640d424..a39c4dda 100644 --- a/src/SelectionManager.test.ts +++ b/src/SelectionManager.test.ts @@ -10,11 +10,12 @@ import { SelectionManager } from './SelectionManager'; import { SelectionModel } from './SelectionModel'; import { BufferSet } from './BufferSet'; import { MockTerminal } from './utils/TestUtils'; +import { LineData } from './Types'; class TestSelectionManager extends SelectionManager { constructor( terminal: ITerminal, - buffer: ICircularList<[number, string, number][]>, + buffer: ICircularList, rowContainer: HTMLElement, charMeasure: CharMeasure ) { @@ -38,7 +39,7 @@ describe('SelectionManager', () => { let document: Document; let terminal: ITerminal; - let bufferLines: ICircularList<[number, string, number][]>; + let bufferLines: ICircularList; let rowContainer: HTMLElement; let selectionManager: TestSelectionManager; @@ -57,8 +58,8 @@ describe('SelectionManager', () => { selectionManager = new TestSelectionManager(terminal, bufferLines, rowContainer, null); }); - function stringToRow(text: string): [number, string, number][] { - let result: [number, string, number][] = []; + function stringToRow(text: string): LineData { + let result: LineData = []; for (let i = 0; i < text.length; i++) { result.push([0, text.charAt(i), 1]); } diff --git a/src/SelectionManager.ts b/src/SelectionManager.ts index e3770c06..781a8eda 100644 --- a/src/SelectionManager.ts +++ b/src/SelectionManager.ts @@ -10,6 +10,7 @@ import { EventEmitter } from './EventEmitter'; import { ITerminal, ICircularList, ISelectionManager } from './Interfaces'; import { SelectionModel } from './SelectionModel'; import { translateBufferLineToString } from './utils/BufferLine'; +import { LineData } from './Types'; /** * The number of pixels the mouse needs to be above or below the viewport in @@ -101,7 +102,7 @@ export class SelectionManager extends EventEmitter implements ISelectionManager constructor( private _terminal: ITerminal, - private _buffer: ICircularList<[number, string, number][]>, + private _buffer: ICircularList, private _rowContainer: HTMLElement, private _charMeasure: CharMeasure ) { @@ -150,7 +151,7 @@ export class SelectionManager extends EventEmitter implements ISelectionManager * switched in or out. * @param buffer The active buffer. */ - public setBuffer(buffer: ICircularList<[number, string, number][]>): void { + public setBuffer(buffer: ICircularList): void { this._buffer = buffer; this.clearSelection(); } diff --git a/src/Terminal.ts b/src/Terminal.ts index 3431df7f..360c2b7e 100644 --- a/src/Terminal.ts +++ b/src/Terminal.ts @@ -29,7 +29,7 @@ import * as Mouse from './utils/Mouse'; import { CHARSETS } from './Charsets'; import { getRawByteCoords } from './utils/Mouse'; import { translateBufferLineToString } from './utils/BufferLine'; -import { CustomKeyEventHandler, Charset, LinkMatcherHandler, LinkMatcherValidationCallback } from './Types'; +import { CustomKeyEventHandler, Charset, LinkMatcherHandler, LinkMatcherValidationCallback, CharData, LineData } from './Types'; import { ITerminal, IBrowser, ITerminalOptions, IInputHandlingTerminal, ILinkMatcherOptions } from './Interfaces'; // Declare for RequireJS in loadAddon @@ -2056,7 +2056,7 @@ export class Terminal extends EventEmitter implements ITerminal, IInputHandlingT if (!line) { return; } - const ch: [number, string, number] = [this.eraseAttr(), ' ', 1]; // xterm + const ch: CharData = [this.eraseAttr(), ' ', 1]; // xterm for (; x < this.cols; x++) { line[x] = ch; } @@ -2073,7 +2073,7 @@ export class Terminal extends EventEmitter implements ITerminal, IInputHandlingT if (!line) { return; } - const ch: [number, string, number] = [this.eraseAttr(), ' ', 1]; // xterm + const ch: CharData = [this.eraseAttr(), ' ', 1]; // xterm x++; while (x--) { line[x] = ch; @@ -2114,11 +2114,11 @@ export class Terminal extends EventEmitter implements ITerminal, IInputHandlingT * @param {boolean} cur First bunch of data for each "blank" character. * @param {boolean} isWrapped Whether the new line is wrapped from the previous line. */ - public blankLine(cur?: boolean, isWrapped?: boolean): [number, string, number][] { + public blankLine(cur?: boolean, isWrapped?: boolean): LineData { const attr = cur ? this.eraseAttr() : this.defAttr; - const ch = [attr, ' ', 1]; // width defaults to 1 halfwidth character - const line = []; + const ch: CharData = [attr, ' ', 1]; // width defaults to 1 halfwidth character + const line: LineData = []; // TODO: It is not ideal that this is a property on an array, a buffer line // class should be added that will hold this data and other useful functions. @@ -2137,7 +2137,7 @@ export class Terminal extends EventEmitter implements ITerminal, IInputHandlingT * If cur return the back color xterm feature attribute. Else return defAttr. * @param cur */ - public ch(cur?: boolean): [number, string, number] { + public ch(cur?: boolean): CharData { return cur ? [this.eraseAttr(), ' ', 1] : [this.defAttr, ' ', 1]; } diff --git a/src/Types.ts b/src/Types.ts index 34c6d94a..0753d80e 100644 --- a/src/Types.ts +++ b/src/Types.ts @@ -15,3 +15,6 @@ export type LinkMatcherValidationCallback = (uri: string, element: HTMLElement, export type CustomKeyEventHandler = (event: KeyboardEvent) => boolean; export type Charset = {[key: string]: string}; + +export type CharData = [number, string, number]; +export type LineData = CharData[]; diff --git a/src/utils/TestUtils.ts b/src/utils/TestUtils.ts index 9fc929fe..51caa8fe 100644 --- a/src/utils/TestUtils.ts +++ b/src/utils/TestUtils.ts @@ -1,4 +1,5 @@ import { ITerminal, IBuffer, IBufferSet, IBrowser, ICharMeasure, ISelectionManager, ITerminalOptions, IListenerType } from '../Interfaces'; +import { LineData } from '../Types'; export class MockTerminal implements ITerminal { options: ITerminalOptions = {}; @@ -47,8 +48,8 @@ export class MockTerminal implements ITerminal { showCursor(): void { throw new Error('Method not implemented.'); } - blankLine(cur?: boolean, isWrapped?: boolean): [number, string, number][] { - const line: [number, string, number][] = []; + blankLine(cur?: boolean, isWrapped?: boolean): LineData { + const line: LineData = []; for (let i = 0; i < this.cols; i++) { line.push([0, ' ', 1]); }