diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminal.ts b/src/vs/workbench/parts/terminal/electron-browser/terminal.ts index 3c2af018470..0b39aafce1d 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminal.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminal.ts @@ -95,16 +95,17 @@ export interface ITerminalConfiguration { export interface ITerminalService { _serviceBrand: any; + activeTerminalInstanceIndex: number; + configHelper: TerminalConfigHelper; onActiveInstanceChanged: Event; onInstancesChanged: Event; onInstanceTitleChanged: Event; - - activeTerminalInstanceIndex: number; - configHelper: TerminalConfigHelper; + // If this needed if getTerminalInstanceTitles is exposed? terminalInstances: ITerminalInstance[]; createInstance(name?: string, shellPath?: string): ITerminalInstance; getInstanceFromId(terminalId: number): ITerminalInstance; + getInstanceTitles(): string[]; getActiveInstance(): ITerminalInstance; setActiveInstance(terminalInstance: ITerminalInstance): void; setActiveInstanceByIndex(terminalIndex: number): void; @@ -118,6 +119,7 @@ export interface ITerminalService { export interface ITerminalInstance { id: number; + onTitleChanged: Event; title: string; //ptyProcess: cp.ChildProcess; //xterm: any; diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalActions.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalActions.ts index e8aa66474bc..d963c6a5e57 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalActions.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalActions.ts @@ -241,7 +241,8 @@ export class SwitchTerminalInstanceActionItem extends SelectActionItem { } private updateItems(): void { - this.setOptions(this.terminalService.terminalInstances.map((t) => t.title), this.terminalService.activeTerminalInstanceIndex); + console.log('updateItems'); + this.setOptions(this.terminalService.getInstanceTitles(), this.terminalService.activeTerminalInstanceIndex); } } diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts index 759f10ee94a..b73e616a15d 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts @@ -4,6 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import DOM = require('vs/base/browser/dom'); +import Event, {Emitter} from 'vs/base/common/event'; import URI from 'vs/base/common/uri'; import cp = require('child_process'); import lifecycle = require('vs/base/common/lifecycle'); @@ -28,10 +29,13 @@ export class TerminalInstance implements ITerminalInstance { private static ID_COUNTER = 1; private static EOL_REGEX = /\r?\n/g; + private _id: number; private _title: string; + private _onTitleChanged: Emitter; public get id(): number { return this._id; } public get title(): string { return this._title; } + public get onTitleChanged(): Event { return this._onTitleChanged.event; } private isExiting: boolean = false; private toDispose: lifecycle.IDisposable[] = []; @@ -56,6 +60,7 @@ export class TerminalInstance implements ITerminalInstance { @IWorkspaceContextService private contextService: IWorkspaceContextService ) { this._id = TerminalInstance.ID_COUNTER++; + this._onTitleChanged = new Emitter(); this.createProcess(name, shellPath); if (container) { @@ -164,9 +169,9 @@ export class TerminalInstance implements ITerminalInstance { // Only listen for process title changes when a name is not provided this.process.on('message', (message) => { if (message.type === 'title') { - process.title = message.content ? message.content : ''; + this._title = message.content ? message.content : ''; // TODO: Send title change notification to service/panel - //this._onInstanceTitleChanged.fire(); + this._onTitleChanged.fire(); } }); } diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts index bd7f8334173..08def18981b 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts @@ -21,17 +21,16 @@ export class TerminalService implements ITerminalService { private _activeTerminalInstanceIndex: number = 0; private _configHelper: TerminalConfigHelper; - private _terminalInstances: ITerminalInstance[] = []; - public get activeTerminalInstanceIndex(): number { return this._activeTerminalInstanceIndex; } - public get configHelper(): TerminalConfigHelper { return this._configHelper; } - public get terminalInstances(): ITerminalInstance[] { return this._terminalInstances; } - private _onActiveInstanceChanged: Emitter; private _onInstancesChanged: Emitter; private _onInstanceTitleChanged: 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 onInstancesChanged(): Event { return this._onInstancesChanged.event; } public get onInstanceTitleChanged(): Event { return this._onInstanceTitleChanged.event; } + public get terminalInstances(): ITerminalInstance[] { return this._terminalInstances; } private terminalContainer: HTMLElement; private terminalFocusContextKey: IContextKey; @@ -53,6 +52,8 @@ export class TerminalService implements ITerminalService { public createInstance(name?: string, shellPath?: string): ITerminalInstance { let terminalInstance = this.instantiationService.createInstance(TerminalInstance, this.terminalFocusContextKey, this.onTerminalInstanceDispose.bind(this), this._configHelper, this.terminalContainer, name, shellPath); + // TODO: Dispose when terminalInstance is disposed + terminalInstance.onTitleChanged(this._onInstanceTitleChanged.fire, this._onInstanceTitleChanged); this.terminalInstances.push(terminalInstance); if (this.terminalInstances.length === 1) { // It's the first instance so it should be focused @@ -62,6 +63,10 @@ export class TerminalService implements ITerminalService { return terminalInstance; } + public getInstanceTitles(): string[] { + return this._terminalInstances.map((instance, index) => `${index + 1}: ${instance.title}`); + } + private onTerminalInstanceDispose(terminalInstance: TerminalInstance): void { // TODO: Handle terminal exit here } @@ -83,9 +88,7 @@ export class TerminalService implements ITerminalService { public setActiveInstanceByIndex(terminalIndex: number): void { this._activeTerminalInstanceIndex = terminalIndex; - // TODO: Inform the panel this._terminalInstances.forEach((terminalInstance, i) => { - console.log('setting visibility', i === terminalIndex); terminalInstance.setVisible(i === terminalIndex); }); this._onActiveInstanceChanged.fire();