From 983cf3b92148e25abed0fbb1c46a5ff8b43603fc Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Sat, 10 Sep 2016 20:05:09 -0700 Subject: [PATCH] Implement terminal kill --- .../api/node/mainThreadTerminalService.ts | 7 +-- .../terminal/electron-browser/terminal.ts | 1 + .../electron-browser/terminalInstance.ts | 50 ++++++++++++++++--- .../electron-browser/terminalService.ts | 24 ++++++++- 4 files changed, 68 insertions(+), 14 deletions(-) diff --git a/src/vs/workbench/api/node/mainThreadTerminalService.ts b/src/vs/workbench/api/node/mainThreadTerminalService.ts index 9133b3b7b1b..94d11f0aa92 100644 --- a/src/vs/workbench/api/node/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/node/mainThreadTerminalService.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ 'use strict'; -import {ITerminalService, TERMINAL_PANEL_ID} from 'vs/workbench/parts/terminal/electron-browser/terminal'; +import {ITerminalService} from 'vs/workbench/parts/terminal/electron-browser/terminal'; import {IPanelService} from 'vs/workbench/services/panel/common/panelService'; import {IPartService} from 'vs/workbench/services/part/common/partService'; import {MainThreadTerminalServiceShape} from './extHost.protocol'; @@ -33,10 +33,7 @@ export class MainThreadTerminalService extends MainThreadTerminalServiceShape { public $hide(terminalId: number): void { if (this.terminalService.getActiveInstance().id === terminalId) { - const panel = this.panelService.getActivePanel(); - if (panel && panel.getId() === TERMINAL_PANEL_ID) { - this.partService.setPanelHidden(true); - } + this.terminalService.hidePanel(); } } diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminal.ts b/src/vs/workbench/parts/terminal/electron-browser/terminal.ts index c4b6c8444b9..561ac99a383 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminal.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminal.ts @@ -112,6 +112,7 @@ export interface ITerminalService { setActiveInstanceToPrevious(): void; showPanel(focus?: boolean): TPromise; + hidePanel(): void; togglePanel(): TPromise; setContainers(panelContainer: Builder, terminalContainer: HTMLElement): void; } diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts index c651b9b3391..f08779abe1b 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts @@ -143,18 +143,53 @@ export class TerminalInstance implements ITerminalInstance { this.layout(new Dimension(this.container.offsetWidth, this.container.offsetHeight)); } - public copySelection(): void {} - public dispose(): void {} - public focus(): void {} - public paste(): void {} - public sendText(text: string, addNewLine: boolean): void {} + public copySelection(): void { + // TODO: Implement + } + + public dispose(): void { + if (this.wrapperElement) { + this.container.removeChild(this.wrapperElement); + this.wrapperElement = null; + } + if (this.xterm) { + this.xterm.destroy(); + this.xterm = null; + } + if (this.process) { + if (this.process.connected) { + this.process.disconnect(); + this.process.kill(); + } + this.process = null; + } + this.toDispose = lifecycle.dispose(this.toDispose); + this.onExitCallback(this); + } + + public focus(): void { + // TODO: Implement + } + + public paste(): void { + // TODO: Implement + } + + public sendText(text: string, addNewLine: boolean): void { + // TODO: Implement + } public setVisible(visible: boolean): void { DOM.toggleClass(this.wrapperElement, 'active', visible); } - public scrollDown(): void {} - public scrollUp(): void {} + public scrollDown(): void { + // TODO: Implement + } + + public scrollUp(): void { + // TODO: Implement + } private sanitizeInput(data: any) { return typeof data === 'string' ? data.replace(TerminalInstance.EOL_REGEX, os.EOL) : data; @@ -187,7 +222,6 @@ export class TerminalInstance implements ITerminalInstance { if (exitCode) { this.messageService.show(Severity.Error, nls.localize('terminal.integrated.exitedWithCode', 'The terminal process terminated with exit code: {0}', exitCode)); } - this.onExitCallback(this); } }); } diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts index 210de4a5b54..3018aaf6906 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalService.ts @@ -68,7 +68,22 @@ export class TerminalService implements ITerminalService { } private onTerminalInstanceDispose(terminalInstance: TerminalInstance): void { - // TODO: Handle terminal exit here + let index = this.terminalInstances.indexOf(terminalInstance); + let wasActiveInstance = terminalInstance === this.getActiveInstance(); + if (index !== -1) { + this.terminalInstances.splice(index, 1); + } + if (wasActiveInstance && this.terminalInstances.length > 0) { + let newIndex = index < this.terminalInstances.length ? index : this.terminalInstances.length - 1; + this.setActiveInstanceByIndex(newIndex); + } + if (this.terminalInstances.length === 0) { + this.hidePanel(); + } + this._onInstancesChanged.fire(); + if (wasActiveInstance) { + this._onActiveInstanceChanged.fire(); + } } public getActiveInstance(): ITerminalInstance { @@ -143,6 +158,13 @@ export class TerminalService implements ITerminalService { }); } + public hidePanel(): void { + const panel = this.panelService.getActivePanel(); + if (panel && panel.getId() === TERMINAL_PANEL_ID) { + this.partService.setPanelHidden(true); + } + } + public togglePanel(): TPromise { const panel = this.panelService.getActivePanel(); if (panel && panel.getId() === TERMINAL_PANEL_ID) {