From cf3faa404605db2e613a99da38000e1c1b2bd2fe Mon Sep 17 00:00:00 2001 From: Megan Rogge Date: Tue, 2 Mar 2021 16:55:38 -0500 Subject: [PATCH] Don't relaunch extension owned terminals (#117987) Co-authored-by: Daniel Imms --- src/vs/platform/terminal/common/terminal.ts | 5 +++++ src/vs/workbench/api/browser/mainThreadTerminalService.ts | 3 ++- src/vs/workbench/api/common/extHost.protocol.ts | 1 + src/vs/workbench/api/common/extHostTerminalService.ts | 5 +++-- src/vs/workbench/api/node/extHostTerminalService.ts | 4 +++- .../workbench/contrib/terminal/browser/terminalInstance.ts | 2 +- 6 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/vs/platform/terminal/common/terminal.ts b/src/vs/platform/terminal/common/terminal.ts index ee81e6ba5b4..54efdbe2c13 100644 --- a/src/vs/platform/terminal/common/terminal.ts +++ b/src/vs/platform/terminal/common/terminal.ts @@ -229,6 +229,11 @@ export interface IShellLaunchConfig { * Whether flow control is enabled for this terminal. */ flowControl?: boolean; + + /** + * Whether this terminal was created by an extension. + */ + isExtensionOwnedTerminal?: boolean; } export interface ITerminalEnvironment { diff --git a/src/vs/workbench/api/browser/mainThreadTerminalService.ts b/src/vs/workbench/api/browser/mainThreadTerminalService.ts index 5c833aa9eb7..77b5c4050f6 100644 --- a/src/vs/workbench/api/browser/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/browser/mainThreadTerminalService.ts @@ -129,7 +129,8 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape hideFromUser: launchConfig.hideFromUser, isExtensionTerminal: launchConfig.isExtensionTerminal, extHostTerminalId: extHostTerminalId, - isFeatureTerminal: launchConfig.isFeatureTerminal + isFeatureTerminal: launchConfig.isFeatureTerminal, + isExtensionOwnedTerminal: launchConfig.isExtensionOwnedTerminal }; const terminal = this._terminalService.createTerminal(shellLaunchConfig); this._extHostTerminalIds.set(extHostTerminalId, terminal.instanceId); diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 7509513e300..0cd656af0cd 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -459,6 +459,7 @@ export interface TerminalLaunchConfig { hideFromUser?: boolean; isExtensionTerminal?: boolean; isFeatureTerminal?: boolean; + isExtensionOwnedTerminal?: boolean; } export interface MainThreadTerminalServiceShape extends IDisposable { diff --git a/src/vs/workbench/api/common/extHostTerminalService.ts b/src/vs/workbench/api/common/extHostTerminalService.ts index aeac665bd64..f04d05e483c 100644 --- a/src/vs/workbench/api/common/extHostTerminalService.ts +++ b/src/vs/workbench/api/common/extHostTerminalService.ts @@ -120,12 +120,13 @@ export class ExtHostTerminal { waitOnExit?: boolean, strictEnv?: boolean, hideFromUser?: boolean, - isFeatureTerminal?: boolean + isFeatureTerminal?: boolean, + isExtensionOwnedTerminal?: boolean ): Promise { if (typeof this._id !== 'string') { throw new Error('Terminal has already been created'); } - await this._proxy.$createTerminal(this._id, { name: this._name, shellPath, shellArgs, cwd, env, waitOnExit, strictEnv, hideFromUser, isFeatureTerminal }); + await this._proxy.$createTerminal(this._id, { name: this._name, shellPath, shellArgs, cwd, env, waitOnExit, strictEnv, hideFromUser, isFeatureTerminal, isExtensionOwnedTerminal }); } public async createExtensionTerminal(): Promise { diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index 4b14a68a9b5..d2b9958bfbd 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -66,7 +66,9 @@ export class ExtHostTerminalService extends BaseExtHostTerminalService { /*options.waitOnExit*/ undefined, withNullAsUndefined(options.strictEnv), withNullAsUndefined(options.hideFromUser), - withNullAsUndefined(isFeatureTerminal)); + withNullAsUndefined(isFeatureTerminal), + true + ); return terminal.value; } diff --git a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts index 22e827825d4..ab483ff20ee 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts @@ -1591,7 +1591,7 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { // Recreate the process if the terminal has not yet been interacted with and it's not a // special terminal (eg. task, extension terminal) - if (info.requiresAction && !this._processManager.hasWrittenData && !this._shellLaunchConfig.isFeatureTerminal && !this._shellLaunchConfig.isExtensionTerminal && !this._shellLaunchConfig.attachPersistentProcess) { + if (info.requiresAction && !this._processManager.hasWrittenData && !this._shellLaunchConfig.isFeatureTerminal && !this._shellLaunchConfig.isExtensionTerminal && !this._shellLaunchConfig.isExtensionOwnedTerminal && !this._shellLaunchConfig.attachPersistentProcess) { this.relaunch(); return; }