From 3db5cd54e18a5ccbcb41f6f8cd559d3b6c467495 Mon Sep 17 00:00:00 2001 From: Habib Karim Date: Mon, 1 Feb 2021 00:45:19 +0000 Subject: [PATCH] Implement Pseudoterminal.onDidChangeName --- .../src/singlefolder-tests/terminal.test.ts | 66 ++++++++++--------- src/vs/vscode.proposed.d.ts | 19 +++++- .../api/browser/mainThreadTerminalService.ts | 8 +-- .../workbench/api/common/extHost.api.impl.ts | 4 -- .../api/common/extHostTerminalService.ts | 12 ++-- .../browser/terminalProcessExtHostProxy.ts | 5 -- .../contrib/terminal/common/terminal.ts | 1 - 7 files changed, 60 insertions(+), 55 deletions(-) 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 2939dc0e17f..c0af3076019 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, commands } from 'vscode'; +import { window, Pseudoterminal, EventEmitter, TerminalDimensions, workspace, ConfigurationTarget, Disposable, UIKind, env, EnvironmentVariableMutatorType, EnvironmentVariableMutator, extensions, ExtensionContext, TerminalOptions, ExtensionTerminalOptions } from 'vscode'; import { doesNotThrow, equal, ok, deepEqual, throws } from 'assert'; // Disable terminal tests: @@ -284,35 +284,6 @@ 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 }); @@ -517,6 +488,41 @@ import { doesNotThrow, equal, ok, deepEqual, throws } from 'assert'; const terminal = window.createTerminal({ name: 'foo', pty }); }); + test('should change terminal name', (done) => { + disposables.push(window.onDidOpenTerminal(term => { + try { + equal(terminal, term); + equal(terminal.name, 'foo'); + } catch (e) { + done(e); + return; + } + disposables.push(window.onDidCloseTerminal(t => { + try { + equal(terminal, t); + equal(terminal.name, 'bar'); + } catch (e) { + done(e); + return; + } + done(); + })); + })); + const changeNameEmitter = new EventEmitter(); + const closeEmitter = new EventEmitter(); + const pty: Pseudoterminal = { + onDidWrite: new EventEmitter().event, + onDidChangeName: changeNameEmitter.event, + onDidClose: closeEmitter.event, + open: () => { + changeNameEmitter.fire('bar'); + closeEmitter.fire(undefined); + }, + close: () => { } + }; + const terminal = window.createTerminal({ name: 'foo', pty }); + }); + test('exitStatus.code should be set to the exit code (undefined)', (done) => { disposables.push(window.onDidOpenTerminal(term => { try { diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index c350e9a4f94..ceaee6cdd78 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -879,11 +879,24 @@ declare module 'vscode' { //#region Terminal name change event https://github.com/microsoft/vscode/issues/114898 - export namespace window { + export interface Pseudoterminal { /** - * An event which fires when the name of the terminal changes. + * An event that when fired allows changing the name of the terminal. + * + * **Example:** Change the terminal name to "My new terminal". + * ```typescript + * const writeEmitter = new vscode.EventEmitter(); + * const changeNameEmitter = new vscode.EventEmitter(); + * const pty: vscode.Pseudoterminal = { + * onDidWrite: writeEmitter.event, + * onDidChangeName: changeNameEmitter.event, + * open: () => changeNameEmitter.fire('My new terminal'), + * close: () => {} + * }; + * vscode.window.createTerminal({ name: 'My terminal', pty }); + * ``` */ - export const onDidChangeTerminalName: Event; + onDidChangeName?: Event; } //#endregion diff --git a/src/vs/workbench/api/browser/mainThreadTerminalService.ts b/src/vs/workbench/api/browser/mainThreadTerminalService.ts index 8dad46c6a88..7c71e8d0d0c 100644 --- a/src/vs/workbench/api/browser/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/browser/mainThreadTerminalService.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { DisposableStore, Disposable, IDisposable } from 'vs/base/common/lifecycle'; -import { IShellLaunchConfig, ITerminalProcessExtHostProxy, ISpawnExtHostProcessRequest, ITerminalDimensions, IAvailableShellsRequest, IDefaultShellAndArgsRequest, IStartExtensionTerminalRequest, ITerminalConfiguration, TERMINAL_CONFIG_SECTION } from 'vs/workbench/contrib/terminal/common/terminal'; +import { IShellLaunchConfig, ITerminalProcessExtHostProxy, ISpawnExtHostProcessRequest, ITerminalDimensions, IAvailableShellsRequest, IDefaultShellAndArgsRequest, IStartExtensionTerminalRequest, ITerminalConfiguration, TERMINAL_CONFIG_SECTION, TitleEventSource } from 'vs/workbench/contrib/terminal/common/terminal'; import { ExtHostContext, ExtHostTerminalServiceShape, MainThreadTerminalServiceShape, MainContext, IExtHostContext, IShellLaunchConfigDto, TerminalLaunchConfig, ITerminalDimensionsDto, TerminalIdentifier } from 'vs/workbench/api/common/extHost.protocol'; import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { URI } from 'vs/base/common/uri'; @@ -308,9 +308,9 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape } public $sendProcessTitle(terminalId: number, title: string): void { - const terminalProcess = this._terminalProcessProxies.get(terminalId); - if (terminalProcess) { - terminalProcess.emitTitle(title); + const instance = this._terminalService.getInstanceFromId(terminalId); + if (instance) { + instance.setTitle(title, TitleEventSource.Api); } } diff --git a/src/vs/workbench/api/common/extHost.api.impl.ts b/src/vs/workbench/api/common/extHost.api.impl.ts index a8271f4ad01..2da02381a46 100644 --- a/src/vs/workbench/api/common/extHost.api.impl.ts +++ b/src/vs/workbench/api/common/extHost.api.impl.ts @@ -540,10 +540,6 @@ 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 a23a8e8674b..14dbba5c34e 100644 --- a/src/vs/workbench/api/common/extHostTerminalService.ts +++ b/src/vs/workbench/api/common/extHostTerminalService.ts @@ -34,7 +34,6 @@ 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; @@ -249,6 +248,9 @@ export class ExtHostPseudoterminal implements ITerminalChildProcess { if (this._pty.onDidOverrideDimensions) { this._pty.onDidOverrideDimensions(e => this._onProcessOverrideDimensions.fire(e ? { cols: e.columns, rows: e.rows } : e)); } + if (this._pty.onDidChangeName) { + this._pty.onDidChangeName(title => this._onProcessTitleChanged.fire(title)); + } this._pty.open(initialDimensions ? initialDimensions : undefined); @@ -298,8 +300,6 @@ 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, @@ -398,11 +398,7 @@ export abstract class BaseExtHostTerminalService extends Disposable implements I public async $acceptTerminalTitleChange(id: number, name: string): Promise { const terminal = this._getTerminalById(id); if (terminal) { - const original = terminal.name; - if (original !== name) { - terminal.name = name; - this._onDidChangeTerminalName.fire(terminal); - } + terminal.name = name; } } diff --git a/src/vs/workbench/contrib/terminal/browser/terminalProcessExtHostProxy.ts b/src/vs/workbench/contrib/terminal/browser/terminalProcessExtHostProxy.ts index 0be5cf88be5..f21b95fd7bf 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalProcessExtHostProxy.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalProcessExtHostProxy.ts @@ -66,11 +66,6 @@ export class TerminalProcessExtHostProxy extends Disposable implements ITerminal this._onProcessData.fire(data); } - public emitTitle(title: string): void { - hasReceivedResponseFromRemoteExtHost = true; - this._onProcessTitleChanged.fire(title); - } - public emitReady(pid: number, cwd: string): void { this._onProcessReady.fire({ pid, cwd }); } diff --git a/src/vs/workbench/contrib/terminal/common/terminal.ts b/src/vs/workbench/contrib/terminal/common/terminal.ts index a8d2a66e345..bc8adf9f4d2 100644 --- a/src/vs/workbench/contrib/terminal/common/terminal.ts +++ b/src/vs/workbench/contrib/terminal/common/terminal.ts @@ -418,7 +418,6 @@ export interface ITerminalProcessExtHostProxy extends IDisposable { readonly terminalId: number; emitData(data: string): void; - emitTitle(title: string): void; emitReady(pid: number, cwd: string): void; emitExit(exitCode: number | undefined): void; emitOverrideDimensions(dimensions: ITerminalDimensions | undefined): void;