diff --git a/src/vs/workbench/api/browser/mainThreadTerminalService.ts b/src/vs/workbench/api/browser/mainThreadTerminalService.ts index 295cafe4de0..4a7e2b8f2be 100644 --- a/src/vs/workbench/api/browser/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/browser/mainThreadTerminalService.ts @@ -228,6 +228,20 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape this._dataEventTracker.clear(); } + public $startSendingCommandEvents(): void { + // TODO: Impl + this._logService.info('$startSendingCommandEvents'); + setInterval(() => { + this._onWillExecuteCommand(this._terminalService.instances[0]!.instanceId, null); + this._onDidExecuteCommand(this._terminalService.instances[0]!.instanceId, null); + }, 3000); + } + + public $stopSendingCommandEvents(): void { + this._logService.info('$stopSendingCommandEvents'); + // TODO: Impl + } + public $startLinkProvider(): void { this._linkProvider?.dispose(); this._linkProvider = this._terminalLinkProviderService.registerLinkProvider(new ExtensionTerminalLinkProvider(this._proxy)); @@ -306,6 +320,13 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape this._proxy.$acceptTerminalProcessData(terminalId, data); } + private _onWillExecuteCommand(terminalId: number, command: any): void { + this._proxy.$acceptWillExecuteCommand(terminalId, command); + } + private _onDidExecuteCommand(terminalId: number, command: any): void { + this._proxy.$acceptDidExecuteCommand(terminalId, command); + } + private _onTitleChanged(terminalId: number, name: string): void { this._proxy.$acceptTerminalTitleChange(terminalId, name); } diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 82646f45cac..1d575b97962 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -509,10 +509,6 @@ export interface MainThreadTerminalServiceShape extends IDisposable { $hide(id: ExtHostTerminalIdentifier): void; $sendText(id: ExtHostTerminalIdentifier, text: string, addNewLine: boolean): void; $show(id: ExtHostTerminalIdentifier, preserveFocus: boolean): void; - $startSendingDataEvents(): void; - $stopSendingDataEvents(): void; - $startLinkProvider(): void; - $stopLinkProvider(): void; $registerProcessSupport(isSupported: boolean): void; $registerProfileProvider(id: string, extensionIdentifier: string): void; $unregisterProfileProvider(id: string): void; @@ -520,6 +516,14 @@ export interface MainThreadTerminalServiceShape extends IDisposable { $unregisterQuickFixProvider(id: string): void; $setEnvironmentVariableCollection(extensionIdentifier: string, persistent: boolean, collection: ISerializableEnvironmentVariableCollection | undefined, descriptionMap: ISerializableEnvironmentDescriptionMap): void; + // Optional event toggles + $startSendingDataEvents(): void; + $stopSendingDataEvents(): void; + $startSendingCommandEvents(): void; + $stopSendingCommandEvents(): void; + $startLinkProvider(): void; + $stopLinkProvider(): void; + // Process $sendProcessData(terminalId: number, data: string): void; $sendProcessReady(terminalId: number, pid: number, cwd: string, windowsPty: IProcessReadyWindowsPty | undefined): void; @@ -2093,6 +2097,8 @@ export interface ExtHostTerminalServiceShape { $acceptActiveTerminalChanged(id: number | null): void; $acceptTerminalProcessId(id: number, processId: number): void; $acceptTerminalProcessData(id: number, data: string): void; + $acceptWillExecuteCommand(id: number, command: any): void; + $acceptDidExecuteCommand(id: number, command: any): void; $acceptTerminalTitleChange(id: number, name: string): void; $acceptTerminalDimensions(id: number, cols: number, rows: number): void; $acceptTerminalMaximumDimensions(id: number, cols: number, rows: number): void; diff --git a/src/vs/workbench/api/common/extHostTerminalService.ts b/src/vs/workbench/api/common/extHostTerminalService.ts index 92d2e7ebf62..12f822bc5bb 100644 --- a/src/vs/workbench/api/common/extHostTerminalService.ts +++ b/src/vs/workbench/api/common/extHostTerminalService.ts @@ -395,17 +395,24 @@ export abstract class BaseExtHostTerminalService extends Disposable implements I readonly onDidChangeTerminalDimensions = this._onDidChangeTerminalDimensions.event; protected readonly _onDidChangeTerminalState = new Emitter(); readonly onDidChangeTerminalState = this._onDidChangeTerminalState.event; - protected readonly _onDidWriteTerminalData: Emitter = new Emitter({ + protected readonly _onDidChangeShell = new Emitter(); + readonly onDidChangeShell = this._onDidChangeShell.event; + + protected readonly _onDidWriteTerminalData = new Emitter({ onWillAddFirstListener: () => this._proxy.$startSendingDataEvents(), onDidRemoveLastListener: () => this._proxy.$stopSendingDataEvents() }); readonly onDidWriteTerminalData = this._onDidWriteTerminalData.event; - protected readonly _onWillExecuteCommand = new Emitter(); + protected readonly _onWillExecuteCommand = new Emitter({ + onWillAddFirstListener: () => this._proxy.$startSendingCommandEvents(), + onDidRemoveLastListener: () => this._proxy.$stopSendingCommandEvents() + }); readonly onWillExecuteTerminalCommand = this._onWillExecuteCommand.event; - protected readonly _onDidExecuteCommand = new Emitter(); + protected readonly _onDidExecuteCommand = new Emitter({ + onWillAddFirstListener: () => this._proxy.$startSendingCommandEvents(), + onDidRemoveLastListener: () => this._proxy.$stopSendingCommandEvents() + }); readonly onDidExecuteTerminalCommand = this._onDidExecuteCommand.event; - protected readonly _onDidChangeShell = new Emitter(); - readonly onDidChangeShell = this._onDidChangeShell.event; constructor( supportsProcesses: boolean, @@ -514,6 +521,26 @@ export abstract class BaseExtHostTerminalService extends Disposable implements I } } + public async $acceptWillExecuteCommand(id: number, command: any): Promise { + const terminal = this._getTerminalById(id); + if (terminal) { + this._onWillExecuteCommand.fire({ + terminal: terminal.value, + command: command + }); + } + } + + public async $acceptDidExecuteCommand(id: number, command: any): Promise { + const terminal = this._getTerminalById(id); + if (terminal) { + this._onDidExecuteCommand.fire({ + terminal: terminal.value, + command: command + }); + } + } + public async $acceptTerminalMaximumDimensions(id: number, cols: number, rows: number): Promise { // Extension pty terminal only - when virtual process resize fires it means that the // terminal's maximum dimensions changed diff --git a/src/vscode-dts/vscode.proposed.terminalExecuteCommandEvent.d.ts b/src/vscode-dts/vscode.proposed.terminalExecuteCommandEvent.d.ts index bfd2e10a196..a9857b8e17b 100644 --- a/src/vscode-dts/vscode.proposed.terminalExecuteCommandEvent.d.ts +++ b/src/vscode-dts/vscode.proposed.terminalExecuteCommandEvent.d.ts @@ -9,7 +9,7 @@ declare module 'vscode' { export interface TerminalWillExecuteCommandEvent { terminal: Terminal; - command: TerminalCommand>; + command: TerminalCommand>; } export interface TerminalExecuteCommandEvent {