diff --git a/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts b/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts index 35192f668ad..6db0db8bed2 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts @@ -35,6 +35,7 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape this._toDispose.push(terminalService.onInstanceRequestExtHostProcess(request => this._onTerminalRequestExtHostProcess(request))); this._toDispose.push(terminalService.onActiveInstanceChanged(instance => this._onActiveTerminalChanged(instance ? instance.id : undefined))); this._toDispose.push(terminalService.onInstanceTitleChanged(instance => this._onTitleChanged(instance.id, instance.title))); + this._toDispose.push(terminalService.onInstanceProcessLaunching(instance => this._onProcessLaunching(instance.id))); // Set initial ext host state this.terminalService.terminalInstances.forEach(t => { @@ -167,6 +168,10 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape this._proxy.$acceptTerminalTitleChange(terminalId, name); } + private _onProcessLaunching(terminalId: number): void { + this._proxy.$acceptTerminalProcessLaunching(terminalId); + } + private _onTerminalRendererInput(terminalId: number, data: string): void { this._proxy.$acceptTerminalRendererInput(terminalId, data); } diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index 113ab79fe56..1603d696881 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -884,6 +884,7 @@ export interface ExtHostTerminalServiceShape { $acceptTerminalProcessId(id: number, processId: number): void; $acceptTerminalProcessData(id: number, data: string): void; $acceptTerminalRendererInput(id: number, data: string): void; + $acceptTerminalProcessLaunching(id: number): void; $acceptTerminalTitleChange(id: number, name: string): void; $acceptTerminalRendererDimensions(id: number, cols: number, rows: number): void; $createProcess(id: number, shellLaunchConfig: ShellLaunchConfigDto, cols: number, rows: number): void; diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index edfa19e3fd5..0325b3dd290 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -90,13 +90,7 @@ export class ExtHostTerminal extends BaseExtHostTerminal implements vscode.Termi pid?: number ) { super(proxy, id); - this._pidPromise = new Promise(c => { - if (pid === RENDERER_NO_PROCESS_ID) { - c(undefined); - } else { - this._pidPromiseComplete = c; - } - }); + this._createProcessIdPromise(pid); } public create( @@ -138,6 +132,16 @@ export class ExtHostTerminal extends BaseExtHostTerminal implements vscode.Termi this._queueApiRequest(this._proxy.$hide, []); } + public _createProcessIdPromise(pid?: number): void { + this._pidPromise = new Promise(c => { + if (pid === RENDERER_NO_PROCESS_ID) { + c(undefined); + } else { + this._pidPromiseComplete = c; + } + }); + } + public _setProcessId(processId: number): void { // The event may fire 2 times when the panel is restored if (this._pidPromiseComplete) { @@ -350,6 +354,10 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { this._performTerminalIdAction(id, terminal => terminal._setProcessId(processId)); } + public $acceptTerminalProcessLaunching(id: number): void { + this._performTerminalIdAction(id, terminal => terminal._createProcessIdPromise()); + } + private _performTerminalIdAction(id: number, callback: (terminal: ExtHostTerminal) => void): void { let terminal = this._getTerminalById(id); if (terminal) { diff --git a/src/vs/workbench/parts/terminal/common/terminal.ts b/src/vs/workbench/parts/terminal/common/terminal.ts index 77ad882bbbf..021a28f9792 100644 --- a/src/vs/workbench/parts/terminal/common/terminal.ts +++ b/src/vs/workbench/parts/terminal/common/terminal.ts @@ -184,6 +184,7 @@ export interface ITerminalService { onTabDisposed: Event; onInstanceCreated: Event; onInstanceDisposed: Event; + onInstanceProcessLaunching: Event; onInstanceProcessIdReady: Event; onInstanceDimensionsChanged: Event; onInstanceRequestExtHostProcess: Event; @@ -319,6 +320,8 @@ export interface ITerminalInstance { onFocused: Event; + onProcessLaunching: Event; + onProcessIdReady: Event; onRequestExtHostProcess: Event; diff --git a/src/vs/workbench/parts/terminal/common/terminalService.ts b/src/vs/workbench/parts/terminal/common/terminalService.ts index 7108b21f38f..9c56ff8f5ba 100644 --- a/src/vs/workbench/parts/terminal/common/terminalService.ts +++ b/src/vs/workbench/parts/terminal/common/terminalService.ts @@ -45,6 +45,8 @@ export abstract class TerminalService implements ITerminalService { public get onInstancesChanged(): Event { return this._onInstancesChanged.event; } protected readonly _onInstanceTitleChanged: Emitter = new Emitter(); public get onInstanceTitleChanged(): Event { return this._onInstanceTitleChanged.event; } + protected readonly _onInstanceProcessLaunching: Emitter = new Emitter(); + public get onInstanceProcessLaunching(): Event { return this._onInstanceProcessLaunching.event; } protected readonly _onActiveInstanceChanged: Emitter = new Emitter(); public get onActiveInstanceChanged(): Event { return this._onActiveInstanceChanged.event; } protected readonly _onTabDisposed: Emitter = new Emitter(); @@ -278,6 +280,7 @@ export abstract class TerminalService implements ITerminalService { instance.addDisposable(instance.onTitleChanged(this._onInstanceTitleChanged.fire, this._onInstanceTitleChanged)); instance.addDisposable(instance.onProcessIdReady(this._onInstanceProcessIdReady.fire, this._onInstanceProcessIdReady)); instance.addDisposable(instance.onDimensionsChanged(() => this._onInstanceDimensionsChanged.fire(instance))); + instance.addDisposable(instance.onProcessLaunching(() => this._onInstanceProcessLaunching.fire(instance))); instance.addDisposable(instance.onFocus(this._onActiveInstanceChanged.fire, this._onActiveInstanceChanged)); } diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts index 8df176d3cee..09feaa032c0 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts @@ -102,6 +102,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 _onProcessLaunching: Emitter = new Emitter(); + public get onProcessLaunching(): Event { return this._onProcessLaunching.event; } private readonly _onData: Emitter = new Emitter(); public get onData(): Event { return this._onData.event; } private readonly _onLineData: Emitter = new Emitter(); @@ -772,6 +774,8 @@ export class TerminalInstance implements ITerminalInstance { this._processManager.onProcessExit(exitCode => this._onProcessExit(exitCode)); this._processManager.onProcessData(data => this._onData.fire(data)); + this._onProcessLaunching.fire(this); + if (this._shellLaunchConfig.name) { this.setTitle(this._shellLaunchConfig.name, false); } else {