From 87328fe29365a5b9fc2a64232c3e857eb4a01923 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Tue, 9 Apr 2019 19:53:02 -0700 Subject: [PATCH] Convert data to EventEmitter2 --- src/InputHandler.ts | 8 +++++--- src/Terminal.ts | 28 ++++++++++++++-------------- src/Types.ts | 4 ---- src/addons/attach/Interfaces.ts | 1 + src/addons/attach/attach.ts | 6 ++++-- src/addons/terminado/Interfaces.ts | 7 ++++++- src/addons/terminado/terminado.ts | 7 ++++--- src/public/Terminal.ts | 2 +- src/ui/TestUtils.test.ts | 2 +- typings/xterm.d.ts | 4 ++-- 10 files changed, 38 insertions(+), 31 deletions(-) diff --git a/src/InputHandler.ts b/src/InputHandler.ts index c77b1c60..fe8ab53d 100644 --- a/src/InputHandler.ts +++ b/src/InputHandler.ts @@ -109,6 +109,8 @@ export class InputHandler extends Disposable implements IInputHandler { private _onCursorMove = new EventEmitter2(); public get onCursorMove(): IEvent { return this._onCursorMove.event; } + private _onData = new EventEmitter2(); + public get onData(): IEvent { return this._onData.event; } private _onLineFeed = new EventEmitter2(); public get onLineFeed(): IEvent { return this._onLineFeed.event; } private _onScroll = new EventEmitter2(); @@ -1725,13 +1727,13 @@ export class InputHandler extends Disposable implements IInputHandler { switch (params[0]) { case 5: // status report - this._terminal.emit('data', `${C0.ESC}[0n`); + this._onData.fire(`${C0.ESC}[0n`); break; case 6: // cursor position const y = this._terminal.buffer.y + 1; const x = this._terminal.buffer.x + 1; - this._terminal.emit('data', `${C0.ESC}[${y};${x}R`); + this._onData.fire(`${C0.ESC}[${y};${x}R`); break; } } else if (collect === '?') { @@ -1742,7 +1744,7 @@ export class InputHandler extends Disposable implements IInputHandler { // cursor position const y = this._terminal.buffer.y + 1; const x = this._terminal.buffer.x + 1; - this._terminal.emit('data', `${C0.ESC}[?${y};${x}R`); + this._onData.fire(`${C0.ESC}[?${y};${x}R`); break; case 15: // no printer diff --git a/src/Terminal.ts b/src/Terminal.ts index dfdb8569..a52da3d5 100644 --- a/src/Terminal.ts +++ b/src/Terminal.ts @@ -224,22 +224,22 @@ export class Terminal extends EventEmitter implements ITerminal, IDisposable, II private _onCursorMove = new EventEmitter2(); public get onCursorMove(): IEvent { return this._onCursorMove.event; } - private _onLineFeed = new EventEmitter2(); - public get onLineFeed(): IEvent { return this._onLineFeed.event; } - private _onSelectionChange = new EventEmitter2(); - public get onSelectionChange(): IEvent { return this._onSelectionChange.event; } - private _onInput = new EventEmitter2(); - public get onInput(): IEvent { return this._onInput.event; } - private _onTitleChange = new EventEmitter2(); - public get onTitleChange(): IEvent { return this._onTitleChange.event; } - private _onScroll = new EventEmitter2(); - public get onScroll(): IEvent { return this._onScroll.event; } + private _onData = new EventEmitter2(); + public get onData(): IEvent { return this._onData.event; } private _onKey = new EventEmitter2<{ key: string, domEvent: KeyboardEvent }>(); public get onKey(): IEvent<{ key: string, domEvent: KeyboardEvent }> { return this._onKey.event; } + private _onLineFeed = new EventEmitter2(); + public get onLineFeed(): IEvent { return this._onLineFeed.event; } private _onRender = new EventEmitter2<{ start: number, end: number }>(); public get onRender(): IEvent<{ start: number, end: number }> { return this._onRender.event; } private _onResize = new EventEmitter2<{ cols: number, rows: number }>(); public get onResize(): IEvent<{ cols: number, rows: number }> { return this._onResize.event; } + private _onScroll = new EventEmitter2(); + public get onScroll(): IEvent { return this._onScroll.event; } + private _onSelectionChange = new EventEmitter2(); + public get onSelectionChange(): IEvent { return this._onSelectionChange.event; } + private _onTitleChange = new EventEmitter2(); + public get onTitleChange(): IEvent { return this._onTitleChange.event; } /** * Creates a new `Terminal` object. @@ -262,12 +262,12 @@ export class Terminal extends EventEmitter implements ITerminal, IDisposable, II // TODO: Replace EventEmitter with EventEmitter2 internally this.on('selection', () => this._onSelectionChange.fire()); - this.on('data', e => this._onInput.fire(e)); this.on('refresh', e => this._onRender.fire(e)); // TODO: Remove these in v4 // Fire old style events from new emitters this.onCursorMove(() => this.emit('cursormove')); + this.onData(e => this.emit('data', e)); this.onKey(e => this.emit('key', e.key, e.domEvent)); this.onLineFeed(() => this.emit('linefeed')); this.onResize(e => this.emit('resize', e)); @@ -313,7 +313,7 @@ export class Terminal extends EventEmitter implements ITerminal, IDisposable, II this.rows = Math.max(this.options.rows, MINIMUM_ROWS); if (this.options.handler) { - this.on('data', this.options.handler); + this.onData(this.options.handler); } this.cursorState = 0; @@ -1831,7 +1831,7 @@ export class Terminal extends EventEmitter implements ITerminal, IDisposable, II } /** - * Emit the 'data' event and populate the given data. + * Emit the data event and populate the given data. * @param data The data to populate in the event. */ public handler(data: string): void { @@ -1849,7 +1849,7 @@ export class Terminal extends EventEmitter implements ITerminal, IDisposable, II if (this.buffer.ybase !== this.buffer.ydisp) { this.scrollToBottom(); } - this.emit('data', data); + this._onData.fire(data); } /** diff --git a/src/Types.ts b/src/Types.ts index 0fcf291e..ef99f147 100644 --- a/src/Types.ts +++ b/src/Types.ts @@ -221,10 +221,6 @@ export interface ITerminal extends PublicTerminal, IElementAccessor, IBufferAcce bracketedPasteMode: boolean; applicationCursor: boolean; - /** - * Emit the 'data' event and populate the given data. - * @param data The data to populate in the event. - */ handler(data: string): void; scrollLines(disp: number, suppressScrollEvent?: boolean): void; cancel(ev: Event, force?: boolean): boolean | void; diff --git a/src/addons/attach/Interfaces.ts b/src/addons/attach/Interfaces.ts index ab5846f5..4b269099 100644 --- a/src/addons/attach/Interfaces.ts +++ b/src/addons/attach/Interfaces.ts @@ -14,6 +14,7 @@ export interface IAttachAddonTerminal extends Terminal { __socket?: WebSocket; __attachSocketBuffer?: string; + __dataListener?: IDisposable; __getMessage?(ev: MessageEvent): void; __flushBuffer?(): void; diff --git a/src/addons/attach/attach.ts b/src/addons/attach/attach.ts index f121e2e2..2c8a5d4d 100644 --- a/src/addons/attach/attach.ts +++ b/src/addons/attach/attach.ts @@ -90,7 +90,8 @@ export function attach(term: Terminal, socket: WebSocket, bidirectional: boolean addonTerminal._core.register(addSocketListener(socket, 'message', addonTerminal.__getMessage)); if (bidirectional) { - addonTerminal._core.register(addonTerminal.addDisposableListener('data', addonTerminal.__sendData)); + addonTerminal.__dataListener = addonTerminal.onData(addonTerminal.__sendData); + addonTerminal._core.register(addonTerminal.__dataListener); } addonTerminal._core.register(addSocketListener(socket, 'close', () => detach(addonTerminal, socket))); @@ -119,7 +120,8 @@ function addSocketListener(socket: WebSocket, type: string, handler: (this: WebS */ export function detach(term: Terminal, socket: WebSocket): void { const addonTerminal = term; - addonTerminal.off('data', addonTerminal.__sendData); + addonTerminal.__dataListener.dispose(); + addonTerminal.__dataListener = undefined; socket = (typeof socket === 'undefined') ? addonTerminal.__socket : socket; diff --git a/src/addons/terminado/Interfaces.ts b/src/addons/terminado/Interfaces.ts index 8f17b0cc..dd7b045c 100644 --- a/src/addons/terminado/Interfaces.ts +++ b/src/addons/terminado/Interfaces.ts @@ -5,11 +5,16 @@ * Implements the attach method, that attaches the terminal to a WebSocket stream. */ -import { Terminal } from 'xterm'; +import { Terminal, IDisposable } from 'xterm'; export interface ITerminadoAddonTerminal extends Terminal { + _core: { + register(d: T): void; + }; + __socket?: WebSocket; __attachSocketBuffer?: string; + __dataListener?: IDisposable; __getMessage?(ev: MessageEvent): void; __flushBuffer?(): void; diff --git a/src/addons/terminado/terminado.ts b/src/addons/terminado/terminado.ts index b36c2cbf..cefa8087 100644 --- a/src/addons/terminado/terminado.ts +++ b/src/addons/terminado/terminado.ts @@ -59,9 +59,9 @@ export function terminadoAttach(term: Terminal, socket: WebSocket, bidirectional socket.addEventListener('message', addonTerminal.__getMessage); if (bidirectional) { - addonTerminal.onInput(addonTerminal.__sendData); + addonTerminal._core.register(addonTerminal.onData(addonTerminal.__sendData); } - addonTerminal.onResize(addonTerminal.__setSize); + addonTerminal._core.register(addonTerminal.onResize(addonTerminal.__setSize)); socket.addEventListener('close', () => terminadoDetach(addonTerminal, socket)); socket.addEventListener('error', () => terminadoDetach(addonTerminal, socket)); @@ -75,7 +75,8 @@ export function terminadoAttach(term: Terminal, socket: WebSocket, bidirectional */ export function terminadoDetach(term: Terminal, socket: WebSocket): void { const addonTerminal = term; - addonTerminal.off('data', addonTerminal.__sendData); + addonTerminal.__dataListener.dispose(); + addonTerminal.__dataListener = undefined; socket = (typeof socket === 'undefined') ? addonTerminal.__socket : socket; diff --git a/src/public/Terminal.ts b/src/public/Terminal.ts index 53c3c693..d05a4f10 100644 --- a/src/public/Terminal.ts +++ b/src/public/Terminal.ts @@ -19,7 +19,7 @@ export class Terminal implements ITerminalApi { public get onCursorMove(): IEvent { return this._core.onCursorMove; } public get onLineFeed(): IEvent { return this._core.onLineFeed; } public get onSelectionChange(): IEvent { return this._core.onSelectionChange; } - public get onInput(): IEvent { return this._core.onInput; } + public get onData(): IEvent { return this._core.onData; } public get onTitleChange(): IEvent { return this._core.onTitleChange; } public get onScroll(): IEvent { return this._core.onScroll; } public get onKey(): IEvent<{ key: string, domEvent: KeyboardEvent }> { return this._core.onKey; } diff --git a/src/ui/TestUtils.test.ts b/src/ui/TestUtils.test.ts index ddf8e2c8..ae57d1f9 100644 --- a/src/ui/TestUtils.test.ts +++ b/src/ui/TestUtils.test.ts @@ -23,7 +23,7 @@ export class MockTerminal implements ITerminal { onCursorMove: IEvent; onLineFeed: IEvent; onSelectionChange: IEvent; - onInput: IEvent; + onData: IEvent; onTitleChange: IEvent; onScroll: IEvent; onKey: IEvent<{ key: string; domEvent: KeyboardEvent; }>; diff --git a/typings/xterm.d.ts b/typings/xterm.d.ts index f8bbdbdb..2c4bb2ec 100644 --- a/typings/xterm.d.ts +++ b/typings/xterm.d.ts @@ -392,13 +392,13 @@ declare module 'xterm' { onSelectionChange: IEvent; /** - * Adds an event listener for when an input event fires. This happens for + * Adds an event listener for when a data event fires. This happens for * example when the user types or pastes into the terminal. The event value * is whatever `string` results, in a typical setup, this should be passed * on to the backing pty. * @returns an `IDisposable` to stop listening. */ - onInput: IEvent; + onData: IEvent; /** * Adds an event listener for when an OSC 0 or OSC 2 title change occurs.