From f957bf8add8658da1a0a41b0cf611200ae4a4c45 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Sat, 16 Jun 2018 18:54:59 +0200 Subject: [PATCH] Get onData working for renderers --- .../mainThreadTerminalService.ts | 8 ++------ .../electron-browser/terminalInstance.ts | 16 ++++++++-------- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts b/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts index aba92f2b64d..d59b8ce4761 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts @@ -16,8 +16,6 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape private _proxy: ExtHostTerminalServiceShape; private _toDispose: IDisposable[] = []; private _terminalProcesses: { [id: number]: ITerminalProcessExtHostProxy } = {}; - private _dataListeners: { [id: number]: IDisposable } = {}; - private _rendererInputListeners: { [id: number]: IDisposable } = {}; constructor( extHostContext: IExtHostContext, @@ -112,8 +110,7 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape public $terminalRendererRegisterOnInputListener(terminalId: number): void { const terminalInstance = this.terminalService.getInstanceFromId(terminalId); if (terminalInstance) { - this._rendererInputListeners[terminalId] = terminalInstance.onRendererInput(data => this._onTerminalRendererInput(terminalId, data)); - terminalInstance.onDisposed(() => delete this._rendererInputListeners[terminalId]); + terminalInstance.addDisposable(terminalInstance.onRendererInput(data => this._onTerminalRendererInput(terminalId, data))); } } @@ -127,8 +124,7 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape public $registerOnDataListener(terminalId: number): void { const terminalInstance = this.terminalService.getInstanceFromId(terminalId); if (terminalInstance) { - this._dataListeners[terminalId] = terminalInstance.onData(data => this._onTerminalData(terminalId, data)); - terminalInstance.onDisposed(() => delete this._dataListeners[terminalId]); + terminalInstance.addDisposable(terminalInstance.onData(data => this._onTerminalData(terminalId, data))); } } diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts index e7e5a31e38b..cace9ec2b6d 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts @@ -99,6 +99,8 @@ export class TerminalInstance implements ITerminalInstance { public get onProcessIdReady(): Event { return this._onProcessIdReady.event; } private readonly _onTitleChanged: Emitter = new Emitter(); public get onTitleChanged(): Event { return this._onTitleChanged.event; } + private readonly _onData: Emitter = new Emitter(); + public get onData(): Event { return this._onData.event; } private readonly _onRequestExtHostProcess: Emitter = new Emitter(); public get onRequestExtHostProcess(): Event { return this._onRequestExtHostProcess.event; } private readonly _onDimensionsChanged: Emitter = new Emitter(); @@ -607,6 +609,10 @@ export class TerminalInstance implements ITerminalInstance { return; } this._xterm.write(text); + if (this._shellLaunchConfig.isRendererOnly) { + // Fire onData API in the extension host + this._onData.fire(text); + } }); } @@ -695,6 +701,8 @@ export class TerminalInstance implements ITerminalInstance { this._processManager.onProcessExit(exitCode => this._onProcessExit(exitCode)); this._processManager.createProcess(this._shellLaunchConfig, this._cols, this._rows); + this._processManager.onProcessData(data => this._onData.fire(data)); + if (this._shellLaunchConfig.name) { this.setTitle(this._shellLaunchConfig.name, false); } else { @@ -826,14 +834,6 @@ export class TerminalInstance implements ITerminalInstance { this._shellLaunchConfig = shell; } - public onData(listener: (data: string) => void): lifecycle.IDisposable { - // TODO: This should still work for renderers - if (!this._processManager) { - return null; - } - return this._processManager.onProcessData(data => listener(data)); - } - public onRendererInput(listener: (data: string) => void): lifecycle.IDisposable { this._onRendererInputListeners.push(listener); return { -- GitLab