Implement proposed TerminalState.isShellIntegrationActivated

This is not protected to only proposed extensions, not clear how
to do it easily for a property.

Part of #205058
This commit is contained in:
Daniel Imms
2024-03-08 12:44:41 -08:00
parent 90cf184847
commit cd76e6976d
4 changed files with 49 additions and 2 deletions
@@ -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
@@ -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<ITerminalLaunchError | undefined>;
$acceptProcessAckDataEvent(id: number, charCount: number): void;
@@ -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<vscode.TerminalState> = {
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);
}
@@ -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;
}
}