From 152d4226e62ca2c811144689bdbc540391032fe6 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Wed, 16 Jun 2021 05:52:54 -0700 Subject: [PATCH] Support detach from process in remote Part of #118276 --- .../workbench/contrib/terminal/browser/remotePty.ts | 5 +++++ src/vs/workbench/contrib/terminal/browser/terminal.ts | 2 +- .../contrib/terminal/browser/terminalActions.ts | 3 ++- .../contrib/terminal/browser/terminalInstance.ts | 4 ++-- .../terminal/browser/terminalProcessManager.ts | 11 +++++++++-- .../contrib/terminal/common/remoteTerminalChannel.ts | 3 +++ src/vs/workbench/contrib/terminal/common/terminal.ts | 2 +- 7 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/remotePty.ts b/src/vs/workbench/contrib/terminal/browser/remotePty.ts index 29a1dcddd88..88c6f74aee1 100644 --- a/src/vs/workbench/contrib/terminal/browser/remotePty.ts +++ b/src/vs/workbench/contrib/terminal/browser/remotePty.ts @@ -68,6 +68,11 @@ export class RemotePty extends Disposable implements ITerminalChildProcess { return undefined; } + async detach(): Promise { + await this._startBarrier.wait(); + return this._remoteTerminalChannel.detachFromProcess(this.id); + } + shutdown(immediate: boolean): void { this._startBarrier.wait().then(_ => { this._remoteTerminalChannel.shutdown(this._id, immediate); diff --git a/src/vs/workbench/contrib/terminal/browser/terminal.ts b/src/vs/workbench/contrib/terminal/browser/terminal.ts index 915ed3cf6dd..ae72482438e 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminal.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminal.ts @@ -490,7 +490,7 @@ export interface ITerminalInstance { /** * Inform the process that the terminal is now detached. */ - detachFromProcess(): void; + detachFromProcess(): Promise; /** * Forces the terminal to redraw its viewport. diff --git a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts index c5856b6d4d9..65443820151 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts @@ -904,7 +904,8 @@ export function registerTerminalActions() { }); } async run(accessor: ServicesAccessor) { - accessor.get(ITerminalService).doWithActiveInstance(instance => instance.detachFromProcess()); + const terminalService = accessor.get(ITerminalService); + await terminalService.getActiveInstance()?.detachFromProcess(); } }); registerAction2(class extends Action2 { diff --git a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts index f980ebc10a2..b98c046f38c 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts @@ -984,8 +984,8 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { super.dispose(); } - detachFromProcess(): void { - this._processManager.detachFromProcess(); + async detachFromProcess(): Promise { + await this._processManager.detachFromProcess(); this.dispose(); } diff --git a/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts b/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts index f09749a3056..2dad49c1105 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalProcessManager.ts @@ -174,8 +174,15 @@ export class TerminalProcessManager extends Disposable implements ITerminalProce }); } - detachFromProcess(): void { - this._process?.detach?.(); + async detachFromProcess(): Promise { + if (!this._process) { + return; + } + if (this._process.detach) { + await this._process.detach(); + } else { + throw new Error('This terminal process does not support detaching'); + } this._process = null; } diff --git a/src/vs/workbench/contrib/terminal/common/remoteTerminalChannel.ts b/src/vs/workbench/contrib/terminal/common/remoteTerminalChannel.ts index bf0c17a4363..ae51b8406a5 100644 --- a/src/vs/workbench/contrib/terminal/common/remoteTerminalChannel.ts +++ b/src/vs/workbench/contrib/terminal/common/remoteTerminalChannel.ts @@ -198,6 +198,9 @@ export class RemoteTerminalChannelClient { attachToProcess(id: number): Promise { return this._channel.call('$attachToProcess', [id]); } + detachFromProcess(id: number): Promise { + return this._channel.call('$detachFromProcess', [id]); + } listProcesses(): Promise { return this._channel.call('$listProcesses'); } diff --git a/src/vs/workbench/contrib/terminal/common/terminal.ts b/src/vs/workbench/contrib/terminal/common/terminal.ts index d2bcc83a66e..2deee6ec2a9 100644 --- a/src/vs/workbench/contrib/terminal/common/terminal.ts +++ b/src/vs/workbench/contrib/terminal/common/terminal.ts @@ -297,7 +297,7 @@ export interface ITerminalProcessManager extends IDisposable { readonly onEnvironmentVariableInfoChanged: Event; dispose(immediate?: boolean): void; - detachFromProcess(): void; + detachFromProcess(): Promise; createProcess(shellLaunchConfig: IShellLaunchConfig, cols: number, rows: number, isScreenReaderModeEnabled: boolean): Promise; relaunch(shellLaunchConfig: IShellLaunchConfig, cols: number, rows: number, isScreenReaderModeEnabled: boolean, reset: boolean): Promise; write(data: string): void;