diff --git a/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts b/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts index 01232a99c8c..2939dc0e17f 100644 --- a/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts +++ b/extensions/vscode-api-tests/src/singlefolder-tests/terminal.test.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { window, Pseudoterminal, EventEmitter, TerminalDimensions, workspace, ConfigurationTarget, Disposable, UIKind, env, EnvironmentVariableMutatorType, EnvironmentVariableMutator, extensions, ExtensionContext, TerminalOptions, ExtensionTerminalOptions } from 'vscode'; +import { window, Pseudoterminal, EventEmitter, TerminalDimensions, workspace, ConfigurationTarget, Disposable, UIKind, env, EnvironmentVariableMutatorType, EnvironmentVariableMutator, extensions, ExtensionContext, TerminalOptions, ExtensionTerminalOptions, commands } from 'vscode'; import { doesNotThrow, equal, ok, deepEqual, throws } from 'assert'; // Disable terminal tests: @@ -284,6 +284,35 @@ import { doesNotThrow, equal, ok, deepEqual, throws } from 'assert'; // terminal1.show(); // }); + test('onDidChangeTerminalName event fires when terminal name is changed', (done) => { + disposables.push(window.onDidOpenTerminal(term => { + try { + equal(term.name, 'foo'); + } catch (e) { + done(e); + return; + } + disposables.push(window.onDidChangeTerminalName(t => { + try { + equal(t.name, 'bar'); + } catch (e) { + done(e); + return; + } + disposables.push(window.onDidCloseTerminal(() => done())); + terminal.dispose(); + })); + })); + const pty: Pseudoterminal = { + onDidWrite: new EventEmitter().event, + open: async () => { + await commands.executeCommand('workbench.action.terminal.renameWithArg', { name: 'bar' }); + }, + close: () => { } + }; + const terminal = window.createTerminal({ name: 'foo', pty }); + }); + suite('hideFromUser', () => { test('should be available to terminals API', done => { const terminal = window.createTerminal({ name: 'bg', hideFromUser: true }); diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 0aa96cf73e5..c350e9a4f94 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -877,6 +877,17 @@ declare module 'vscode' { //#endregion + //#region Terminal name change event https://github.com/microsoft/vscode/issues/114898 + + export namespace window { + /** + * An event which fires when the name of the terminal changes. + */ + export const onDidChangeTerminalName: Event; + } + + //#endregion + // eslint-disable-next-line vscode-dts-region-comments //#region @jrieken -> exclusive document filters diff --git a/src/vs/workbench/api/common/extHost.api.impl.ts b/src/vs/workbench/api/common/extHost.api.impl.ts index 2da02381a46..a8271f4ad01 100644 --- a/src/vs/workbench/api/common/extHost.api.impl.ts +++ b/src/vs/workbench/api/common/extHost.api.impl.ts @@ -540,6 +540,10 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I checkProposedApiEnabled(extension); return extHostTerminalService.onDidWriteTerminalData(listener, thisArg, disposables); }, + onDidChangeTerminalName(listener, thisArg?, disposables?) { + checkProposedApiEnabled(extension); + return extHostTerminalService.onDidChangeTerminalName(listener, thisArg, disposables); + }, get state() { return extHostWindow.state; }, diff --git a/src/vs/workbench/api/common/extHostTerminalService.ts b/src/vs/workbench/api/common/extHostTerminalService.ts index f684dbb85b4..a23a8e8674b 100644 --- a/src/vs/workbench/api/common/extHostTerminalService.ts +++ b/src/vs/workbench/api/common/extHostTerminalService.ts @@ -34,6 +34,7 @@ export interface IExtHostTerminalService extends ExtHostTerminalServiceShape, ID onDidChangeActiveTerminal: Event; onDidChangeTerminalDimensions: Event; onDidWriteTerminalData: Event; + onDidChangeTerminalName: Event; createTerminal(name?: string, shellPath?: string, shellArgs?: string[] | string): vscode.Terminal; createTerminalFromOptions(options: vscode.TerminalOptions, isFeatureTerminal?: boolean): vscode.Terminal; @@ -297,6 +298,8 @@ export abstract class BaseExtHostTerminalService extends Disposable implements I public get onDidChangeTerminalDimensions(): Event { return this._onDidChangeTerminalDimensions && this._onDidChangeTerminalDimensions.event; } protected readonly _onDidWriteTerminalData: Emitter; public get onDidWriteTerminalData(): Event { return this._onDidWriteTerminalData && this._onDidWriteTerminalData.event; } + protected readonly _onDidChangeTerminalName: Emitter = new Emitter(); + public get onDidChangeTerminalName(): Event { return this._onDidChangeTerminalName && this._onDidChangeTerminalName.event; } constructor( supportsProcesses: boolean, @@ -395,7 +398,11 @@ export abstract class BaseExtHostTerminalService extends Disposable implements I public async $acceptTerminalTitleChange(id: number, name: string): Promise { const terminal = this._getTerminalById(id); if (terminal) { - terminal.name = name; + const original = terminal.name; + if (original !== name) { + terminal.name = name; + this._onDidChangeTerminalName.fire(terminal); + } } }