diff --git a/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts b/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts index ccf129ce117..c25e31ae085 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts @@ -16,6 +16,8 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape private _proxy: ExtHostTerminalServiceShape; private _toDispose: IDisposable[] = []; private _terminalProcesses: { [id: number]: ITerminalProcessExtHostProxy } = {}; + private _terminalOnDidWriteDataListeners: { [id: number]: IDisposable } = {}; + private _terminalOnDidAcceptInputListeners: { [id: number]: IDisposable } = {}; constructor( extHostContext: IExtHostContext, @@ -114,9 +116,18 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape public $terminalRendererRegisterOnInputListener(terminalId: number): void { const terminalInstance = this.terminalService.getInstanceFromId(terminalId); - if (terminalInstance) { - terminalInstance.addDisposable(terminalInstance.onRendererInput(data => this._onTerminalRendererInput(terminalId, data))); + if (!terminalInstance) { + return; } + + // Listener already registered + if (this._terminalOnDidAcceptInputListeners.hasOwnProperty(terminalId)) { + return; + } + + // Register + this._terminalOnDidAcceptInputListeners[terminalId] = terminalInstance.onRendererInput(data => this._onTerminalRendererInput(terminalId, data)); + terminalInstance.addDisposable(this._terminalOnDidAcceptInputListeners[terminalId]); } public $sendText(terminalId: number, text: string, addNewLine: boolean): void { @@ -128,11 +139,20 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape public $registerOnDataListener(terminalId: number): void { const terminalInstance = this.terminalService.getInstanceFromId(terminalId); - if (terminalInstance) { - terminalInstance.addDisposable(terminalInstance.onData(data => { - this._onTerminalData(terminalId, data); - })); + if (!terminalInstance) { + return; } + + // Listener already registered + if (this._terminalOnDidWriteDataListeners[terminalId]) { + return; + } + + // Register + this._terminalOnDidWriteDataListeners[terminalId] = terminalInstance.onData(data => { + this._onTerminalData(terminalId, data); + }); + terminalInstance.addDisposable(this._terminalOnDidWriteDataListeners[terminalId]); } private _onActiveTerminalChanged(terminalId: number | undefined): void {