diff --git a/src/vs/workbench/api/node/mainThreadTerminalService.ts b/src/vs/workbench/api/node/mainThreadTerminalService.ts index 7f59a79d877..742510fb4c9 100644 --- a/src/vs/workbench/api/node/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/node/mainThreadTerminalService.ts @@ -25,13 +25,12 @@ export class MainThreadTerminalService extends MainThreadTerminalServiceShape { public $show(terminalId: number, preserveFocus: boolean): void { this._terminalService.show(!preserveFocus).then((terminalPanel) => { - terminalPanel.setActiveTerminalById(terminalId); + this._terminalService.setActiveTerminalById(terminalId); }); } public $hide(terminalId: number): void { - // TODO: Use terminalId to hide it - this._terminalService.hide(); + this._terminalService.hideTerminalInstance(terminalId); } public $dispose(terminalId: number): void { @@ -43,7 +42,7 @@ export class MainThreadTerminalService extends MainThreadTerminalServiceShape { public $sendText(terminalId: number, text: string, addNewLine: boolean): void { this._terminalService.show(false).then((terminalPanel) => { - terminalPanel.setActiveTerminalById(terminalId); + this._terminalService.setActiveTerminalById(terminalId); terminalPanel.sendTextToActiveTerminal(text, addNewLine); }); } diff --git a/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.ts b/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.ts index bfb0bb61b69..c91ae59635d 100644 --- a/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.ts +++ b/src/vs/workbench/parts/debug/electron-browser/rawDebugSession.ts @@ -347,7 +347,7 @@ export class RawDebugSession extends v8.V8Protocol implements debug.IRawDebugSes protected runInTerminal(args: DebugProtocol.RunInTerminalRequestArguments): TPromise { return this.terminalService.createNew(args.title || nls.localize('debuggee', "debuggee")).then(id => { return this.terminalService.show(false).then(terminalPanel => { - terminalPanel.setActiveTerminalById(id); + this.terminalService.setActiveTerminalById(id); terminalPanel.sendTextToActiveTerminal(args.args.join(' '), true); }); }); diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminal.ts b/src/vs/workbench/parts/terminal/electron-browser/terminal.ts index 40b297a3552..68e37e2f519 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminal.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminal.ts @@ -70,12 +70,14 @@ export interface ITerminalService { focusNext(): TPromise; focusPrevious(): TPromise; hide(): TPromise; + hideTerminalInstance(terminalId: number): TPromise; paste(): TPromise; runSelectedText(): TPromise; scrollDown(): TPromise; scrollUp(): TPromise; show(focus: boolean): TPromise; setActiveTerminal(index: number): TPromise; + setActiveTerminalById(terminalId: number): void; toggle(): TPromise; getActiveTerminalIndex(): number; @@ -87,5 +89,4 @@ export interface ITerminalService { export interface ITerminalPanel { closeTerminalById(terminalId: number): TPromise; sendTextToActiveTerminal(text: string, addNewLine: boolean): void; - setActiveTerminalById(terminalId: number): void; } diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalActions.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalActions.ts index 86f720bf3be..e93a1522c7b 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalActions.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalActions.ts @@ -184,7 +184,9 @@ export class SwitchTerminalInstanceAction extends Action { public run(item?: string): TPromise { let selectedTerminalIndex = parseInt(item.split(':')[0], 10) - 1; - return this.terminalService.setActiveTerminal(selectedTerminalIndex); + return this.terminalService.show(true).then(() => { + this.terminalService.setActiveTerminal(selectedTerminalIndex); + }); } } diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts index 310bc8223ca..9327986397f 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalPanel.ts @@ -256,10 +256,6 @@ export class TerminalPanel extends Panel implements ITerminalPanel { return terminalIndex; } - public setActiveTerminalById(terminalId: number): void { - this.setActiveTerminal(this.getTerminalIndexFromId(terminalId)); - } - private onTerminalInstanceExit(terminalInstance: TerminalInstance): void { let index = this.terminalInstances.indexOf(terminalInstance); if (index !== -1) { diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts index 76034b38cbc..73b79b5332e 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts @@ -66,7 +66,7 @@ export class TerminalService implements ITerminalService { } public setActiveTerminal(index: number): TPromise { - return this.focus().then((terminalPanel) => { + return this.show(false).then((terminalPanel) => { this.activeTerminalIndex = index; terminalPanel.setActiveTerminal(this.activeTerminalIndex); terminalPanel.focus(); @@ -74,6 +74,23 @@ export class TerminalService implements ITerminalService { }); } + public setActiveTerminalById(terminalId: number): void { + this.setActiveTerminal(this.getTerminalIndexFromId(terminalId)); + } + + private getTerminalIndexFromId(terminalId: number): number { + let terminalIndex = -1; + this.terminalProcesses.forEach((terminalProcess, i) => { + if (terminalProcess.process.pid === terminalId) { + terminalIndex = i; + } + }); + if (terminalIndex === -1) { + throw new Error(`Terminal with ID ${terminalId} does not exist (has it already been disposed?)`); + } + return terminalIndex; + } + public focusNext(): TPromise { return this.focus().then((terminalPanel) => { if (this.terminalProcesses.length <= 1) { @@ -142,7 +159,17 @@ export class TerminalService implements ITerminalService { if (panel && panel.getId() === TERMINAL_PANEL_ID) { this.partService.setPanelHidden(true); } - return TPromise.as(null); + return TPromise.as(void 0); + } + + public hideTerminalInstance(terminalId: number): TPromise { + const panel = this.panelService.getActivePanel(); + if (panel && panel.getId() === TERMINAL_PANEL_ID) { + if (this.terminalProcesses[this.getActiveTerminalIndex()].process.pid === terminalId) { + this.partService.setPanelHidden(true); + } + } + return TPromise.as(void 0); } public toggle(): TPromise {