diff --git a/src/vs/workbench/api/browser/mainThreadTerminalService.ts b/src/vs/workbench/api/browser/mainThreadTerminalService.ts index 28bc27cbb12..5e6c7e8c1fe 100644 --- a/src/vs/workbench/api/browser/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/browser/mainThreadTerminalService.ts @@ -84,6 +84,11 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape this._store.add(_terminalService.onDidChangeActiveInstance(instance => this._onActiveTerminalChanged(instance ? instance.instanceId : null))); this._store.add(_terminalService.onAnyInstanceTitleChange(instance => instance && this._onTitleChanged(instance.instanceId, instance.title))); this._store.add(_terminalService.onAnyInstanceDataInput(instance => this._proxy.$acceptTerminalInteraction(instance.instanceId))); + this._store.add(_terminalService.onDidChangeInstanceCapability(instance => { + if (instance.capabilities.has(TerminalCapability.CommandDetection)) { + this._proxy.$acceptTerminalShellIntegrationActivation(instance.instanceId); + } + })); this._store.add(_terminalService.onAnyInstanceSelectionChange(instance => this._proxy.$acceptTerminalSelection(instance.instanceId, instance.selection))); // Set initial ext host state diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 9055bfa9aea..61deb70f334 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -2238,6 +2238,7 @@ export interface ExtHostTerminalServiceShape { $acceptTerminalDimensions(id: number, cols: number, rows: number): void; $acceptTerminalMaximumDimensions(id: number, cols: number, rows: number): void; $acceptTerminalInteraction(id: number): void; + $acceptTerminalShellIntegrationActivation(id: number): void; $acceptTerminalSelection(id: number, selection: string | undefined): void; $startExtensionTerminal(id: number, initialDimensions: ITerminalDimensionsDto | undefined): Promise; $acceptProcessAckDataEvent(id: number, charCount: number): void; diff --git a/src/vs/workbench/api/common/extHostTerminalService.ts b/src/vs/workbench/api/common/extHostTerminalService.ts index cbe28de19ca..d1a0144fe98 100644 --- a/src/vs/workbench/api/common/extHostTerminalService.ts +++ b/src/vs/workbench/api/common/extHostTerminalService.ts @@ -82,7 +82,10 @@ export class ExtHostTerminal { private _pidPromiseComplete: ((value: number | undefined) => any) | undefined; private _rows: number | undefined; private _exitStatus: vscode.TerminalExitStatus | undefined; - private _state: vscode.TerminalState = { isInteractedWith: false }; + private _state: Readonly = { + isInteractedWith: false, + isShellIntegrationActivated: false, + }; private _selection: string | undefined; public isOpen: boolean = false; @@ -240,7 +243,21 @@ export class ExtHostTerminal { public setInteractedWith(): boolean { if (!this._state.isInteractedWith) { - this._state = { isInteractedWith: true }; + this._state = { + ...this._state, + isInteractedWith: true, + }; + return true; + } + return false; + } + + public setShellIntegrationActivated(): boolean { + if (!this._state.isShellIntegrationActivated) { + this._state = { + ...this._state, + isShellIntegrationActivated: true, + }; return true; } return false; @@ -671,6 +688,13 @@ export abstract class BaseExtHostTerminalService extends Disposable implements I } } + public $acceptTerminalShellIntegrationActivation(id: number): void { + const terminal = this._getTerminalById(id); + if (terminal?.setShellIntegrationActivated()) { + this._onDidChangeTerminalState.fire(terminal.value); + } + } + public $acceptTerminalSelection(id: number, selection: string | undefined): void { this._getTerminalById(id)?.setSelection(selection); } diff --git a/src/vscode-dts/vscode.proposed.terminalShellIntegrationActivated.ts b/src/vscode-dts/vscode.proposed.terminalShellIntegrationActivated.ts new file mode 100644 index 00000000000..e9a01f00aed --- /dev/null +++ b/src/vscode-dts/vscode.proposed.terminalShellIntegrationActivated.ts @@ -0,0 +1,17 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +declare module 'vscode' { + + // https://github.com/microsoft/vscode/issues/205058 + + export interface TerminalState { + /** + * Whether the {@link Terminal} has had [shell integration](https://code.visualstudio.com/docs/terminal/shell-integration) + * activated. This typically happens shortly after the terminal has been created. + */ + readonly isShellIntegrationActivated: boolean; + } +}