diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.ts b/src/vs/workbench/contrib/terminal/browser/terminal.ts index 5d3c6bfb77d..31cac615fef 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.ts @@ -214,6 +214,7 @@ export interface ITerminalService { getEditableData(instance: ITerminalInstance): IEditableData | undefined; setEditable(instance: ITerminalInstance, data: IEditableData | null): Promise; instanceIsSplit(instance: ITerminalInstance): boolean; + safeDisposeTerminal(instance: ITerminalInstance): Promise; } export interface IRemoteTerminalService extends IOffProcessTerminalService { diff --git a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts index 29675f981cb..8c39384e207 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts @@ -1627,10 +1627,10 @@ export function registerTerminalActions() { if (!selectedInstances) { return; } - for (const instance of selectedInstances) { - instance.dispose(true); - } const terminalService = accessor.get(ITerminalService); + for (const instance of selectedInstances) { + terminalService.safeDisposeTerminal(instance); + } if (terminalService.terminalInstances.length > 0) { terminalService.focusTabs(); focusNext(accessor); diff --git a/src/vs/workbench/contrib/terminal/browser/terminalService.ts b/src/vs/workbench/contrib/terminal/browser/terminalService.ts index 9f13ba2cfc8..88b3bca9fe7 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalService.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalService.ts @@ -220,6 +220,16 @@ export class TerminalService implements ITerminalService { this._refreshAvailableProfiles(); } + async safeDisposeTerminal(instance: ITerminalInstance): Promise { + if (this.configHelper.config.confirmOnExit) { + const notConfirmed = await this._showTerminalCloseConfirmation(true); + if (notConfirmed) { + return; + } + } + instance.dispose(); + } + private _setConnected() { this._connectionState = TerminalConnectionState.Connected; this._onDidChangeConnectionState.fire(); @@ -870,9 +880,9 @@ export class TerminalService implements ITerminalService { return terminalIndex; } - protected async _showTerminalCloseConfirmation(): Promise { + protected async _showTerminalCloseConfirmation(singleTerminal?: boolean): Promise { let message: string; - if (this.terminalInstances.length === 1) { + if (this.terminalInstances.length === 1 || singleTerminal) { message = nls.localize('terminalService.terminalCloseConfirmationSingular', "There is an active terminal session, do you want to kill it?"); } else { message = nls.localize('terminalService.terminalCloseConfirmationPlural', "There are {0} active terminal sessions, do you want to kill them?", this.terminalInstances.length); diff --git a/src/vs/workbench/contrib/terminal/browser/terminalTabsList.ts b/src/vs/workbench/contrib/terminal/browser/terminalTabsList.ts index 2893dacb848..b67adc0272c 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalTabsList.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalTabsList.ts @@ -309,7 +309,7 @@ class TerminalTabsRenderer implements IListRenderer { e.stopImmediatePropagation(); if (e.button === 1/*middle*/) { - instance.dispose(); + this._terminalService.safeDisposeTerminal(instance); } }));