提交 3db5cd54 编写于 作者: H Habib Karim

Implement Pseudoterminal.onDidChangeName

上级 28a74470
......@@ -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<string>().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<string>();
const closeEmitter = new EventEmitter<number | undefined>();
const pty: Pseudoterminal = {
onDidWrite: new EventEmitter<string>().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 {
......
......@@ -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<string>();
* const changeNameEmitter = new vscode.EventEmitter<string>();
* 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<Terminal>;
onDidChangeName?: Event<string>;
}
//#endregion
......
......@@ -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);
}
}
......
......@@ -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;
},
......
......@@ -34,7 +34,6 @@ export interface IExtHostTerminalService extends ExtHostTerminalServiceShape, ID
onDidChangeActiveTerminal: Event<vscode.Terminal | undefined>;
onDidChangeTerminalDimensions: Event<vscode.TerminalDimensionsChangeEvent>;
onDidWriteTerminalData: Event<vscode.TerminalDataWriteEvent>;
onDidChangeTerminalName: Event<vscode.Terminal>;
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<vscode.TerminalDimensionsChangeEvent> { return this._onDidChangeTerminalDimensions && this._onDidChangeTerminalDimensions.event; }
protected readonly _onDidWriteTerminalData: Emitter<vscode.TerminalDataWriteEvent>;
public get onDidWriteTerminalData(): Event<vscode.TerminalDataWriteEvent> { return this._onDidWriteTerminalData && this._onDidWriteTerminalData.event; }
protected readonly _onDidChangeTerminalName: Emitter<vscode.Terminal> = new Emitter<vscode.Terminal>();
public get onDidChangeTerminalName(): Event<vscode.Terminal> { 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<void> {
const terminal = this._getTerminalById(id);
if (terminal) {
const original = terminal.name;
if (original !== name) {
terminal.name = name;
this._onDidChangeTerminalName.fire(terminal);
}
terminal.name = name;
}
}
......
......@@ -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 });
}
......
......@@ -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;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册