diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 2a170de1c92..b70ba71e62c 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -887,6 +887,59 @@ declare module 'vscode' { //#endregion + //#region Terminal state event https://github.com/microsoft/vscode/issues/127717 + + /** + * Represents the state of a {@link Terminal}. + */ + export interface TerminalState { + /** + * Whether the {@link Terminal} has been interacted with. Interaction means that the + * terminal has sent data to the process which depending on the terminal's _mode_. By + * default input is sent when a key is pressed but based on the terminal's mode it can also + * happen on: + * + * - a pointer click event + * - a pointer scroll event + * - a pointer move event + * - terminal focus in/out + * + * For more information on events that can send data see "DEC Private Mode Set (DECSET)" on + * https://invisible-island.net/xterm/ctlseqs/ctlseqs.html + */ + readonly interactedWith: boolean; + } + + export interface Terminal { + /** + * The current state of the {@link Terminal}. + */ + readonly state: TerminalState; + } + + /** + * An event representing a change in a {@link Terminal.state terminal's state}. + */ + export interface TerminalStateChangeEvent { + /** + * The {@link Terminal} this event occurred on. + */ + readonly terminal: Terminal; + /** + * The {@link Terminal.state current state} of the {@link Terminal}. + */ + readonly state: TerminalState; + } + + export namespace window { + /** + * An {@link Event} which fires when a {@link Terminal.state terminal's state} has changed. + */ + export const onDidChangeTerminalState: Event; + } + + //#endregion + //#region Terminal name change event https://github.com/microsoft/vscode/issues/114898 export interface Pseudoterminal { diff --git a/src/vs/workbench/api/common/extHost.api.impl.ts b/src/vs/workbench/api/common/extHost.api.impl.ts index c3d6ddb95c8..06f21c73ef5 100644 --- a/src/vs/workbench/api/common/extHost.api.impl.ts +++ b/src/vs/workbench/api/common/extHost.api.impl.ts @@ -568,6 +568,10 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I checkProposedApiEnabled(extension); return extHostTerminalService.onDidChangeTerminalDimensions(listener, thisArg, disposables); }, + onDidChangeTerminalState(listener, thisArg?, disposables?) { + checkProposedApiEnabled(extension); + return extHostTerminalService.onDidChangeTerminalState(listener, thisArg, disposables); + }, onDidWriteTerminalData(listener, thisArg?, disposables?) { checkProposedApiEnabled(extension); return extHostTerminalService.onDidWriteTerminalData(listener, thisArg, disposables); diff --git a/src/vs/workbench/api/common/extHostTerminalService.ts b/src/vs/workbench/api/common/extHostTerminalService.ts index 6f6da4761c6..9a9273a2c10 100644 --- a/src/vs/workbench/api/common/extHostTerminalService.ts +++ b/src/vs/workbench/api/common/extHostTerminalService.ts @@ -326,16 +326,18 @@ export abstract class BaseExtHostTerminalService extends Disposable implements I public get activeTerminal(): vscode.Terminal | undefined { return this._activeTerminal?.value; } public get terminals(): vscode.Terminal[] { return this._terminals.map(term => term.value); } - protected readonly _onDidCloseTerminal: Emitter = new Emitter(); - public get onDidCloseTerminal(): Event { return this._onDidCloseTerminal && this._onDidCloseTerminal.event; } - protected readonly _onDidOpenTerminal: Emitter = new Emitter(); - public get onDidOpenTerminal(): Event { return this._onDidOpenTerminal && this._onDidOpenTerminal.event; } - protected readonly _onDidChangeActiveTerminal: Emitter = new Emitter(); - public get onDidChangeActiveTerminal(): Event { return this._onDidChangeActiveTerminal && this._onDidChangeActiveTerminal.event; } - protected readonly _onDidChangeTerminalDimensions: Emitter = new Emitter(); - public get onDidChangeTerminalDimensions(): Event { return this._onDidChangeTerminalDimensions && this._onDidChangeTerminalDimensions.event; } + protected readonly _onDidCloseTerminal = new Emitter(); + readonly onDidCloseTerminal = this._onDidCloseTerminal.event; + protected readonly _onDidOpenTerminal = new Emitter(); + readonly onDidOpenTerminal = this._onDidOpenTerminal.event; + protected readonly _onDidChangeActiveTerminal = new Emitter(); + readonly onDidChangeActiveTerminal = this._onDidChangeActiveTerminal.event; + protected readonly _onDidChangeTerminalDimensions = new Emitter(); + readonly onDidChangeTerminalDimensions = this._onDidChangeTerminalDimensions.event; + protected readonly _onDidChangeTerminalState = new Emitter(); + readonly onDidChangeTerminalState = this._onDidChangeTerminalState.event; protected readonly _onDidWriteTerminalData: Emitter; - public get onDidWriteTerminalData(): Event { return this._onDidWriteTerminalData && this._onDidWriteTerminalData.event; } + readonly onDidWriteTerminalData: Event; constructor( supportsProcesses: boolean, @@ -348,6 +350,7 @@ export abstract class BaseExtHostTerminalService extends Disposable implements I onFirstListenerAdd: () => this._proxy.$startSendingDataEvents(), onLastListenerRemove: () => this._proxy.$stopSendingDataEvents() }); + this.onDidWriteTerminalData = this._onDidWriteTerminalData.event; this._proxy.$registerProcessSupport(supportsProcesses); this._register({ dispose: () => {