From 2e02b52debcf262d7df795c10e59ddf3f0e30b01 Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Thu, 15 Sep 2016 12:26:14 -0700 Subject: [PATCH] Have terminal service clean up instances using event --- .../workbench/api/node/mainThreadTerminalService.ts | 4 ++-- .../parts/terminal/electron-browser/terminal.ts | 2 +- .../terminal/electron-browser/terminalInstance.ts | 11 ++++------- .../terminal/electron-browser/terminalService.ts | 12 ++++++------ 4 files changed, 13 insertions(+), 16 deletions(-) diff --git a/src/vs/workbench/api/node/mainThreadTerminalService.ts b/src/vs/workbench/api/node/mainThreadTerminalService.ts index 6e4edf49b25..b41793c9daf 100644 --- a/src/vs/workbench/api/node/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/node/mainThreadTerminalService.ts @@ -26,7 +26,7 @@ export class MainThreadTerminalService extends MainThreadTerminalServiceShape { super(); this._proxy = threadService.get(ExtHostContext.ExtHostTerminalService); this._toDispose = []; - this._toDispose.push(terminalService.onInstanceClosed((terminalInstance) => this._onTerminalClosed(terminalInstance))); + this._toDispose.push(terminalService.onInstanceDisposed((terminalInstance) => this._onTerminalDisposed(terminalInstance))); } public dispose(): void { @@ -65,7 +65,7 @@ export class MainThreadTerminalService extends MainThreadTerminalServiceShape { } } - private _onTerminalClosed(terminalInstance: ITerminalInstance): void { + private _onTerminalDisposed(terminalInstance: ITerminalInstance): void { this._proxy.$acceptTerminalClosed(terminalInstance.id); } } diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminal.ts b/src/vs/workbench/parts/terminal/electron-browser/terminal.ts index bfe51b61531..fb96711da24 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminal.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminal.ts @@ -58,7 +58,7 @@ export interface ITerminalService { activeTerminalInstanceIndex: number; configHelper: TerminalConfigHelper; onActiveInstanceChanged: Event; - onInstanceClosed: Event; + onInstanceDisposed: Event; onInstancesChanged: Event; onInstanceTitleChanged: Event; terminalInstances: ITerminalInstance[]; diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts index c9e96aa6f9f..35ed68e82c5 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts @@ -31,11 +31,11 @@ export class TerminalInstance implements ITerminalInstance { private _id: number; private _title: string; - private _onClosed: Emitter; + private _onDisposed: Emitter; private _onTitleChanged: Emitter; public get id(): number { return this._id; } public get title(): string { return this._title; } - public get onClosed(): Event { return this._onClosed.event; } + public get onClosed(): Event { return this._onDisposed.event; } public get onTitleChanged(): Event { return this._onTitleChanged.event; } private isExiting: boolean = false; @@ -49,7 +49,6 @@ export class TerminalInstance implements ITerminalInstance { public constructor( private terminalFocusContextKey: IContextKey, - private onExitCallback: (TerminalInstance) => void, private configHelper: TerminalConfigHelper, private container: HTMLElement, private workspace: IWorkspace, @@ -60,7 +59,7 @@ export class TerminalInstance implements ITerminalInstance { ) { this._id = TerminalInstance.ID_COUNTER++; this._onTitleChanged = new Emitter(); - this._onClosed = new Emitter(); + this._onDisposed = new Emitter(); this.createProcess(workspace, name, shell); if (container) { @@ -170,10 +169,8 @@ export class TerminalInstance implements ITerminalInstance { } this.process = null; } - this._onClosed.fire(this); + this._onDisposed.fire(this); this.toDispose = lifecycle.dispose(this.toDispose); - // TODO: Move exit callback to listen onClose event - this.onExitCallback(this); } public focus(force?: boolean): void { diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts index 2e5968b6cdb..cbcc8204db8 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts @@ -23,14 +23,14 @@ export class TerminalService implements ITerminalService { private _activeTerminalInstanceIndex: number = 0; private _configHelper: TerminalConfigHelper; private _onActiveInstanceChanged: Emitter; - private _onInstanceClosed: Emitter; + private _onInstanceDisposed: Emitter; private _onInstanceTitleChanged: Emitter; private _onInstancesChanged: Emitter; private _terminalInstances: ITerminalInstance[] = []; public get activeTerminalInstanceIndex(): number { return this._activeTerminalInstanceIndex; } public get configHelper(): TerminalConfigHelper { return this._configHelper; } public get onActiveInstanceChanged(): Event { return this._onActiveInstanceChanged.event; } - public get onInstanceClosed(): Event { return this._onInstanceClosed.event; } + public get onInstanceDisposed(): Event { return this._onInstanceDisposed.event; } public get onInstanceTitleChanged(): Event { return this._onInstanceTitleChanged.event; } public get onInstancesChanged(): Event { return this._onInstancesChanged.event; } public get terminalInstances(): ITerminalInstance[] { return this._terminalInstances; } @@ -47,11 +47,12 @@ export class TerminalService implements ITerminalService { @IWorkspaceContextService private workspaceContextService: IWorkspaceContextService ) { this._onActiveInstanceChanged = new Emitter(); - this._onInstanceClosed = new Emitter(); + this._onInstanceDisposed = new Emitter(); this._onInstancesChanged = new Emitter(); this._onInstanceTitleChanged = new Emitter(); this.terminalFocusContextKey = KEYBINDING_CONTEXT_TERMINAL_FOCUS.bindTo(this.contextKeyService); this._configHelper = this.instantiationService.createInstance(TerminalConfigHelper, platform.platform); + this.onInstanceDisposed((terminalInstance) => { this.removeInstance(terminalInstance); }); } public createInstance(name?: string, shellPath?: string, shellArgs?: string[]): ITerminalInstance { @@ -61,14 +62,13 @@ export class TerminalService implements ITerminalService { }; let terminalInstance = this.instantiationService.createInstance(TerminalInstance, this.terminalFocusContextKey, - this.onTerminalInstanceDispose.bind(this), this._configHelper, this.terminalContainer, this.workspaceContextService.getWorkspace(), name, shell); terminalInstance.addDisposable(terminalInstance.onTitleChanged(this._onInstanceTitleChanged.fire, this._onInstanceTitleChanged)); - terminalInstance.addDisposable(terminalInstance.onClosed(this._onInstanceClosed.fire, this._onInstanceClosed)); + terminalInstance.addDisposable(terminalInstance.onClosed(this._onInstanceDisposed.fire, this._onInstanceDisposed)); this.terminalInstances.push(terminalInstance); if (this.terminalInstances.length === 1) { // It's the first instance so it should be made active automatically @@ -82,7 +82,7 @@ export class TerminalService implements ITerminalService { return this._terminalInstances.map((instance, index) => `${index + 1}: ${instance.title}`); } - private onTerminalInstanceDispose(terminalInstance: TerminalInstance): void { + private removeInstance(terminalInstance: ITerminalInstance): void { let index = this.terminalInstances.indexOf(terminalInstance); let wasActiveInstance = terminalInstance === this.getActiveInstance(); if (index !== -1) {