Revert "follow up to TerminalProperty (#132892)"

This reverts commit 7238f3848f.
This commit is contained in:
meganrogge
2021-09-10 14:33:58 -07:00
parent 7238f3848f
commit 997c2725d2
14 changed files with 63 additions and 86 deletions
+7 -12
View File
@@ -178,18 +178,13 @@ export enum TerminalIpcChannels {
export const IPtyService = createDecorator<IPtyService>('ptyService');
export const enum TerminalPropertyType {
Cwd,
InitialCwd
cwd,
initialCwd
}
export interface ITerminalProperty<T extends TerminalPropertyType> {
type: T,
value: ITerminalPropertyMap[T]
}
export interface ITerminalPropertyMap {
[TerminalPropertyType.Cwd]: string,
[TerminalPropertyType.InitialCwd]: string,
export interface TerminalProperty {
type: TerminalPropertyType,
value: any
}
export interface IPtyService {
@@ -212,7 +207,7 @@ export interface IPtyService {
readonly onProcessOrphanQuestion: Event<{ id: number }>;
readonly onDidRequestDetach: Event<{ requestId: number, workspaceId: string, instanceId: number }>;
readonly onProcessDidChangeHasChildProcesses: Event<{ id: number, event: boolean }>;
readonly onDidChangeProperty: Event<{ id: number, property: ITerminalProperty<any> }>
readonly onDidChangeProperty: Event<{ id: number, event: TerminalProperty }>
restartPtyHost?(): Promise<void>;
shutdownAll?(): Promise<void>;
@@ -488,7 +483,7 @@ export interface ITerminalChildProcess {
onProcessOverrideDimensions?: Event<ITerminalDimensionsOverride | undefined>;
onProcessResolvedShellLaunchConfig?: Event<IShellLaunchConfig>;
onDidChangeHasChildProcesses?: Event<boolean>;
onDidChangeProperty: Event<ITerminalProperty<any>>;
onDidChangeProperty: Event<TerminalProperty>;
/**
* Starts the process.
@@ -15,7 +15,7 @@ import { ILogService } from 'vs/platform/log/common/log';
import { LogLevelChannelClient } from 'vs/platform/log/common/logIpc';
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
import { RequestStore } from 'vs/platform/terminal/common/requestStore';
import { HeartbeatConstants, IHeartbeatService, IProcessDataEvent, IPtyService, IReconnectConstants, IRequestResolveVariablesEvent, IShellLaunchConfig, ITerminalDimensionsOverride, ITerminalLaunchError, ITerminalProfile, ITerminalsLayoutInfo, TerminalIcon, TerminalIpcChannels, ITerminalProperty, TerminalShellType, TitleEventSource } from 'vs/platform/terminal/common/terminal';
import { HeartbeatConstants, IHeartbeatService, IProcessDataEvent, IPtyService, IReconnectConstants, IRequestResolveVariablesEvent, IShellLaunchConfig, ITerminalDimensionsOverride, ITerminalLaunchError, ITerminalProfile, ITerminalsLayoutInfo, TerminalIcon, TerminalIpcChannels, TerminalProperty, TerminalShellType, TitleEventSource } from 'vs/platform/terminal/common/terminal';
import { registerTerminalPlatformConfiguration } from 'vs/platform/terminal/common/terminalPlatformConfiguration';
import { IGetTerminalLayoutInfoArgs, IProcessDetails, IPtyHostProcessReplayEvent, ISetTerminalLayoutInfoArgs } from 'vs/platform/terminal/common/terminalProcess';
import { detectAvailableProfiles } from 'vs/platform/terminal/node/terminalProfiles';
@@ -83,7 +83,7 @@ export class PtyHostService extends Disposable implements IPtyService {
readonly onDidRequestDetach = this._onDidRequestDetach.event;
private readonly _onProcessDidChangeHasChildProcesses = this._register(new Emitter<{ id: number, event: boolean }>());
readonly onProcessDidChangeHasChildProcesses = this._onProcessDidChangeHasChildProcesses.event;
private readonly _onDidChangeProperty = this._register(new Emitter<{ id: number, property: ITerminalProperty<any> }>());
private readonly _onDidChangeProperty = this._register(new Emitter<{ id: number, event: TerminalProperty }>());
readonly onDidChangeProperty = this._onDidChangeProperty.event;
constructor(
+4 -4
View File
@@ -12,7 +12,7 @@ import { URI } from 'vs/base/common/uri';
import { getSystemShell } from 'vs/base/node/shell';
import { ILogService } from 'vs/platform/log/common/log';
import { RequestStore } from 'vs/platform/terminal/common/requestStore';
import { IProcessDataEvent, IProcessReadyEvent, IPtyService, IRawTerminalInstanceLayoutInfo, IReconnectConstants, IRequestResolveVariablesEvent, IShellLaunchConfig, ITerminalDimensionsOverride, ITerminalInstanceLayoutInfoById, ITerminalLaunchError, ITerminalsLayoutInfo, ITerminalTabLayoutInfoById, TerminalIcon, ITerminalProperty, TerminalShellType, TitleEventSource } from 'vs/platform/terminal/common/terminal';
import { IProcessDataEvent, IProcessReadyEvent, IPtyService, IRawTerminalInstanceLayoutInfo, IReconnectConstants, IRequestResolveVariablesEvent, IShellLaunchConfig, ITerminalDimensionsOverride, ITerminalInstanceLayoutInfoById, ITerminalLaunchError, ITerminalsLayoutInfo, ITerminalTabLayoutInfoById, TerminalIcon, TerminalProperty, TerminalShellType, TitleEventSource } from 'vs/platform/terminal/common/terminal';
import { TerminalDataBufferer } from 'vs/platform/terminal/common/terminalDataBuffering';
import { escapeNonWindowsPath } from 'vs/platform/terminal/common/terminalEnvironment';
import { Terminal as XtermTerminal } from 'xterm-headless';
@@ -60,7 +60,7 @@ export class PtyService extends Disposable implements IPtyService {
readonly onDidRequestDetach = this._onDidRequestDetach.event;
private readonly _onProcessDidChangeHasChildProcesses = this._register(new Emitter<{ id: number, event: boolean }>());
readonly onProcessDidChangeHasChildProcesses = this._onProcessDidChangeHasChildProcesses.event;
private readonly _onDidChangeProperty = this._register(new Emitter<{ id: number, property: ITerminalProperty<any> }>());
private readonly _onDidChangeProperty = this._register(new Emitter<{ id: number, event: TerminalProperty }>());
readonly onDidChangeProperty = this._onDidChangeProperty.event;
constructor(
@@ -140,7 +140,7 @@ export class PtyService extends Disposable implements IPtyService {
persistentProcess.onProcessReplay(event => this._onProcessReplay.fire({ id, event }));
persistentProcess.onProcessReady(event => this._onProcessReady.fire({ id, event }));
persistentProcess.onProcessTitleChanged(event => this._onProcessTitleChanged.fire({ id, event }));
persistentProcess.onDidChangeProperty(property => this._onDidChangeProperty.fire({ id, property }));
persistentProcess.onDidChangeProperty(event => this._onDidChangeProperty.fire({ id, event }));
persistentProcess.onProcessShellTypeChanged(event => this._onProcessShellTypeChanged.fire({ id, event }));
persistentProcess.onProcessOrphanQuestion(() => this._onProcessOrphanQuestion.fire({ id }));
this._ptys.set(id, persistentProcess);
@@ -342,7 +342,7 @@ export class PersistentTerminalProcess extends Disposable {
readonly onProcessData = this._onProcessData.event;
private readonly _onProcessOrphanQuestion = this._register(new Emitter<void>());
readonly onProcessOrphanQuestion = this._onProcessOrphanQuestion.event;
private readonly _onDidChangeProperty = this._register(new Emitter<ITerminalProperty<any>>());
private readonly _onDidChangeProperty = this._register(new Emitter<TerminalProperty>());
readonly onDidChangeProperty = this._onDidChangeProperty.event;
private _inReplay = false;
@@ -15,7 +15,7 @@ import { URI } from 'vs/base/common/uri';
import { Promises } from 'vs/base/node/pfs';
import { localize } from 'vs/nls';
import { ILogService } from 'vs/platform/log/common/log';
import { FlowControlConstants, IProcessReadyEvent, IShellLaunchConfig, ITerminalChildProcess, ITerminalDimensionsOverride, ITerminalLaunchError, ITerminalProperty, TerminalPropertyType, TerminalShellType } from 'vs/platform/terminal/common/terminal';
import { FlowControlConstants, IProcessReadyEvent, IShellLaunchConfig, ITerminalChildProcess, ITerminalDimensionsOverride, ITerminalLaunchError, TerminalProperty, TerminalShellType } from 'vs/platform/terminal/common/terminal';
import { ChildProcessMonitor } from 'vs/platform/terminal/node/childProcessMonitor';
import { findExecutable, getWindowsBuildNumber } from 'vs/platform/terminal/node/terminalEnvironment';
import { WindowsShellHelper } from 'vs/platform/terminal/node/windowsShellHelper';
@@ -77,8 +77,6 @@ export class TerminalProcess extends Disposable implements ITerminalChildProcess
readonly id = 0;
readonly shouldPersist = false;
currentCwd: string | undefined = undefined;
private static _lastKillOrStart = 0;
private _exitCode: number | undefined;
@@ -116,7 +114,7 @@ export class TerminalProcess extends Disposable implements ITerminalChildProcess
readonly onProcessShellTypeChanged = this._onProcessShellTypeChanged.event;
private readonly _onDidChangeHasChildProcesses = this._register(new Emitter<boolean>());
readonly onDidChangeHasChildProcesses = this._onDidChangeHasChildProcesses.event;
private readonly _onDidChangeProperty = this._register(new Emitter<ITerminalProperty<any>>());
private readonly _onDidChangeProperty = this._register(new Emitter<TerminalProperty>());
readonly onDidChangeProperty = this._onDidChangeProperty.event;
onProcessOverrideDimensions?: Event<ITerminalDimensionsOverride | undefined> | undefined;
@@ -145,7 +143,6 @@ export class TerminalProcess extends Disposable implements ITerminalChildProcess
name = 'xterm-256color';
}
this._initialCwd = cwd;
this.currentCwd = cwd;
const useConpty = windowsEnableConpty && process.platform === 'win32' && getWindowsBuildNumber() >= 18309;
this._ptyOptions = {
name,
@@ -206,7 +203,6 @@ export class TerminalProcess extends Disposable implements ITerminalChildProcess
return { message: localize('launchFail.cwdDoesNotExist', "Starting directory (cwd) \"{0}\" does not exist", this._initialCwd.toString()) };
}
}
this._onDidChangeProperty.fire({ type: TerminalPropertyType.InitialCwd, value: this._initialCwd });
return undefined;
}
@@ -498,12 +494,7 @@ export class TerminalProcess extends Disposable implements ITerminalChildProcess
this._logService.trace('IPty#pid');
exec('lsof -OPln -p ' + this._ptyProcess.pid + ' | grep cwd', (error, stdout, stderr) => {
if (!error && stdout !== '') {
const newCwd = stdout.substring(stdout.indexOf('/'), stdout.length - 1);
if (this.currentCwd !== newCwd) {
this.currentCwd = newCwd;
this._onDidChangeProperty.fire({ type: TerminalPropertyType.Cwd, value: this.currentCwd });
resolve(newCwd);
}
resolve(stdout.substring(stdout.indexOf('/'), stdout.length - 1));
} else {
this._logService.error('lsof did not run successfully, it may not be on the $PATH?', error, stdout, stderr);
resolve(this._initialCwd);
@@ -519,12 +510,7 @@ export class TerminalProcess extends Disposable implements ITerminalChildProcess
}
this._logService.trace('IPty#pid');
try {
const newCwd = await Promises.readlink(`/proc/${this._ptyProcess.pid}/cwd`);
if (newCwd !== this.currentCwd) {
this.currentCwd = newCwd;
this._onDidChangeProperty.fire({ type: TerminalPropertyType.Cwd, value: this.currentCwd });
}
return this.currentCwd;
return await Promises.readlink(`/proc/${this._ptyProcess.pid}/cwd`);
} catch (error) {
return this._initialCwd;
}
@@ -18,7 +18,7 @@ import { serializeEnvironmentVariableCollection } from 'vs/workbench/contrib/ter
import { CancellationTokenSource } from 'vs/base/common/cancellation';
import { generateUuid } from 'vs/base/common/uuid';
import { ISerializableEnvironmentVariableCollection } from 'vs/workbench/contrib/terminal/common/environmentVariable';
import { ICreateContributedTerminalProfileOptions, IProcessReadyEvent, IShellLaunchConfigDto, ITerminalChildProcess, ITerminalDimensionsOverride, ITerminalLaunchError, ITerminalProfile, TerminalIcon, TerminalLocation, ITerminalProperty, TerminalShellType } from 'vs/platform/terminal/common/terminal';
import { ICreateContributedTerminalProfileOptions, IProcessReadyEvent, IShellLaunchConfigDto, ITerminalChildProcess, ITerminalDimensionsOverride, ITerminalLaunchError, ITerminalProfile, TerminalIcon, TerminalLocation, TerminalProperty, TerminalShellType } from 'vs/platform/terminal/common/terminal';
import { TerminalDataBufferer } from 'vs/platform/terminal/common/terminalDataBuffering';
import { ThemeColor } from 'vs/platform/theme/common/themeService';
import { withNullAsUndefined } from 'vs/base/common/types';
@@ -250,7 +250,7 @@ export class ExtHostPseudoterminal implements ITerminalChildProcess {
public get onProcessOverrideDimensions(): Event<ITerminalDimensionsOverride | undefined> { return this._onProcessOverrideDimensions.event; }
private readonly _onProcessShellTypeChanged = new Emitter<TerminalShellType>();
public readonly onProcessShellTypeChanged = this._onProcessShellTypeChanged.event;
private readonly _onDidChangeProperty = new Emitter<ITerminalProperty<any>>();
private readonly _onDidChangeProperty = new Emitter<TerminalProperty>();
public readonly onDidChangeProperty = this._onDidChangeProperty.event;
@@ -8,16 +8,14 @@ import { Emitter } from 'vs/base/common/event';
import { Disposable } from 'vs/base/common/lifecycle';
import { URI } from 'vs/base/common/uri';
import { ILogService } from 'vs/platform/log/common/log';
import { IProcessDataEvent, IProcessReadyEvent, IShellLaunchConfig, ITerminalChildProcess, ITerminalDimensionsOverride, ITerminalLaunchError, ITerminalProperty, TerminalPropertyType, TerminalShellType } from 'vs/platform/terminal/common/terminal';
import { IProcessDataEvent, IProcessReadyEvent, IShellLaunchConfig, ITerminalChildProcess, ITerminalDimensionsOverride, ITerminalLaunchError, TerminalProperty, TerminalPropertyType, TerminalShellType } from 'vs/platform/terminal/common/terminal';
import { IPtyHostProcessReplayEvent } from 'vs/platform/terminal/common/terminalProcess';
import { RemoteTerminalChannelClient } from 'vs/workbench/contrib/terminal/common/remoteTerminalChannel';
import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService';
export class RemotePty extends Disposable implements ITerminalChildProcess {
private _properties: {
cwd: string;
initialCwd: string
};
initialCwd: string | undefined = undefined;
cwd: string | undefined = undefined;
private readonly _onProcessData = this._register(new Emitter<string | IProcessDataEvent>());
readonly onProcessData = this._onProcessData.event;
private readonly _onProcessExit = this._register(new Emitter<number | undefined>());
@@ -34,7 +32,7 @@ export class RemotePty extends Disposable implements ITerminalChildProcess {
readonly onProcessResolvedShellLaunchConfig = this._onProcessResolvedShellLaunchConfig.event;
private readonly _onDidChangeHasChildProcesses = this._register(new Emitter<boolean>());
readonly onDidChangeHasChildProcesses = this._onDidChangeHasChildProcesses.event;
private readonly _onDidChangeProperty = this._register(new Emitter<ITerminalProperty<any>>());
private readonly _onDidChangeProperty = this._register(new Emitter<TerminalProperty>());
readonly onDidChangeProperty = this._onDidChangeProperty.event;
private _startBarrier: Barrier;
@@ -51,10 +49,6 @@ export class RemotePty extends Disposable implements ITerminalChildProcess {
private readonly _logService: ILogService
) {
super();
this._properties = {
cwd: '',
initialCwd: ''
};
this._startBarrier = new Barrier();
}
@@ -126,11 +120,21 @@ export class RemotePty extends Disposable implements ITerminalChildProcess {
}
async getInitialCwd(): Promise<string> {
return this._properties.initialCwd;
if (!this.initialCwd) {
await this._startBarrier.wait();
this.initialCwd = await this._remoteTerminalChannel.getInitialCwd(this._id);
}
return this.initialCwd;
}
async getCwd(): Promise<string> {
return this._properties.cwd || this._properties.initialCwd;
await this._startBarrier.wait();
const cwd = await this._remoteTerminalChannel.getCwd(this._id);
if (this.cwd !== cwd) {
this.cwd = cwd;
this.handleDidChangeProperty({ type: TerminalPropertyType.cwd, value: this.cwd });
}
return this.cwd;
}
handleData(e: string | IProcessDataEvent) {
@@ -164,12 +168,7 @@ export class RemotePty extends Disposable implements ITerminalChildProcess {
handleDidChangeHasChildProcesses(e: boolean) {
this._onDidChangeHasChildProcesses.fire(e);
}
handleDidChangeProperty(e: ITerminalProperty<any>) {
if (e.type === TerminalPropertyType.Cwd) {
this._properties.cwd = e.value;
} else if (e.type === TerminalPropertyType.InitialCwd) {
this._properties.initialCwd = e.value;
}
handleDidChangeProperty(e: TerminalProperty) {
this._onDidChangeProperty.fire(e);
}
@@ -79,7 +79,7 @@ export class RemoteTerminalService extends Disposable implements IRemoteTerminal
channel.onProcessOrphanQuestion(e => this._ptys.get(e.id)?.handleOrphanQuestion());
channel.onDidRequestDetach(e => this._onDidRequestDetach.fire(e));
channel.onProcessDidChangeHasChildProcesses(e => this._ptys.get(e.id)?.handleDidChangeHasChildProcesses(e.event));
channel.onDidChangeProperty(e => this._ptys.get(e.id)?.handleDidChangeProperty(e.property));
channel.onDidChangeProperty(e => this._ptys.get(e.id)?.handleDidChangeProperty(e.event));
const allowedCommands = ['_remoteCLI.openExternal', '_remoteCLI.windowOpen', '_remoteCLI.getSystemStatus', '_remoteCLI.manageExtensions'];
channel.onExecuteCommand(async e => {
@@ -1160,7 +1160,7 @@ export class TerminalInstance extends Disposable implements ITerminalInstance {
// Set the initial name based on the _resolved_ shell launch config, this will also
// ensure the resolved icon gets shown
this._processManager.onDidChangeProperty(e => {
if (e.type === TerminalPropertyType.Cwd || e.type === TerminalPropertyType.InitialCwd) {
if (e.type === TerminalPropertyType.cwd || e.type === TerminalPropertyType.initialCwd) {
this._cwd = e.value;
this.setTitle(this.title, TitleEventSource.Api);
}
@@ -5,7 +5,7 @@
import { Emitter, Event } from 'vs/base/common/event';
import { Disposable } from 'vs/base/common/lifecycle';
import { IProcessReadyEvent, IShellLaunchConfig, ITerminalChildProcess, ITerminalDimensions, ITerminalDimensionsOverride, ITerminalLaunchError, ITerminalProperty, TerminalShellType } from 'vs/platform/terminal/common/terminal';
import { IProcessReadyEvent, IShellLaunchConfig, ITerminalChildProcess, ITerminalDimensions, ITerminalDimensionsOverride, ITerminalLaunchError, TerminalProperty, TerminalShellType } from 'vs/platform/terminal/common/terminal';
import { ITerminalService } from 'vs/workbench/contrib/terminal/browser/terminal';
import { ITerminalProcessExtHostProxy } from 'vs/workbench/contrib/terminal/common/terminal';
@@ -46,7 +46,7 @@ export class TerminalProcessExtHostProxy extends Disposable implements ITerminal
readonly onRequestLatency: Event<void> = this._onRequestLatency.event;
private readonly _onProcessShellTypeChanged = this._register(new Emitter<TerminalShellType>());
readonly onProcessShellTypeChanged = this._onProcessShellTypeChanged.event;
private readonly _onDidChangeProperty = this._register(new Emitter<ITerminalProperty<any>>());
private readonly _onDidChangeProperty = this._register(new Emitter<TerminalProperty>());
readonly onDidChangeProperty = this._onDidChangeProperty.event;
@@ -22,7 +22,7 @@ import { withNullAsUndefined } from 'vs/base/common/types';
import { EnvironmentVariableInfoChangesActive, EnvironmentVariableInfoStale } from 'vs/workbench/contrib/terminal/browser/environmentVariableInfo';
import { IPathService } from 'vs/workbench/services/path/common/pathService';
import { IEnvironmentVariableInfo, IEnvironmentVariableService, IMergedEnvironmentVariableCollection } from 'vs/workbench/contrib/terminal/common/environmentVariable';
import { IProcessDataEvent, IShellLaunchConfig, ITerminalChildProcess, ITerminalDimensionsOverride, ITerminalEnvironment, ITerminalLaunchError, FlowControlConstants, TerminalShellType, ITerminalDimensions, TerminalSettingId, IProcessReadyEvent, ITerminalProperty } from 'vs/platform/terminal/common/terminal';
import { IProcessDataEvent, IShellLaunchConfig, ITerminalChildProcess, ITerminalDimensionsOverride, ITerminalEnvironment, ITerminalLaunchError, FlowControlConstants, TerminalShellType, ITerminalDimensions, TerminalSettingId, IProcessReadyEvent, TerminalProperty } from 'vs/platform/terminal/common/terminal';
import { TerminalRecorder } from 'vs/platform/terminal/common/terminalRecorder';
import { localize } from 'vs/nls';
import { formatMessageForTerminal } from 'vs/workbench/contrib/terminal/common/terminalStrings';
@@ -96,7 +96,7 @@ export class TerminalProcessManager extends Disposable implements ITerminalProce
readonly onProcessData = this._onProcessData.event;
private readonly _onProcessTitle = this._register(new Emitter<string>());
readonly onProcessTitle = this._onProcessTitle.event;
private readonly _onDidChangeProperty = this._register(new Emitter<ITerminalProperty<any>>());
private readonly _onDidChangeProperty = this._register(new Emitter<TerminalProperty>());
readonly onDidChangeProperty = this._onDidChangeProperty.event;
private readonly _onProcessShellTypeChanged = this._register(new Emitter<TerminalShellType>());
readonly onProcessShellTypeChanged = this._onProcessShellTypeChanged.event;
@@ -18,7 +18,7 @@ import { IEditorService } from 'vs/workbench/services/editor/common/editorServic
import { Schemas } from 'vs/base/common/network';
import { ILabelService } from 'vs/platform/label/common/label';
import { IEnvironmentVariableService, ISerializableEnvironmentVariableCollection } from 'vs/workbench/contrib/terminal/common/environmentVariable';
import { IProcessDataEvent, IRequestResolveVariablesEvent, IShellLaunchConfig, IShellLaunchConfigDto, ITerminalDimensionsOverride, ITerminalEnvironment, ITerminalLaunchError, ITerminalProfile, ITerminalsLayoutInfo, ITerminalsLayoutInfoById, TerminalIcon, ITerminalProperty, TerminalShellType } from 'vs/platform/terminal/common/terminal';
import { IProcessDataEvent, IRequestResolveVariablesEvent, IShellLaunchConfig, IShellLaunchConfigDto, ITerminalDimensionsOverride, ITerminalEnvironment, ITerminalLaunchError, ITerminalProfile, ITerminalsLayoutInfo, ITerminalsLayoutInfoById, TerminalIcon, TerminalProperty, TerminalShellType } from 'vs/platform/terminal/common/terminal';
import { IGetTerminalLayoutInfoArgs, IProcessDetails, IPtyHostProcessReplayEvent, ISetTerminalLayoutInfoArgs } from 'vs/platform/terminal/common/terminalProcess';
import { IProcessEnvironment, OperatingSystem } from 'vs/base/common/platform';
@@ -124,8 +124,8 @@ export class RemoteTerminalChannelClient {
get onDidRequestDetach(): Event<{ requestId: number, workspaceId: string, instanceId: number }> {
return this._channel.listen<{ requestId: number, workspaceId: string, instanceId: number }>('$onDidRequestDetach');
}
get onDidChangeProperty(): Event<{ id: number, property: ITerminalProperty<any> }> {
return this._channel.listen<{ id: number, property: ITerminalProperty<any> }>('$onDidChangeProperty');
get onDidChangeProperty(): Event<{ id: number, event: TerminalProperty }> {
return this._channel.listen<{ id: number, event: TerminalProperty }>('$onDidChangeProperty');
}
constructor(
@@ -8,7 +8,7 @@ import { Event } from 'vs/base/common/event';
import { IDisposable } from 'vs/base/common/lifecycle';
import { IProcessEnvironment, OperatingSystem } from 'vs/base/common/platform';
import { IExtensionPointDescriptor } from 'vs/workbench/services/extensions/common/extensionsRegistry';
import { IProcessDataEvent, IProcessReadyEvent, IShellLaunchConfig, ITerminalChildProcess, ITerminalDimensions, ITerminalDimensionsOverride, ITerminalLaunchError, ITerminalProfile, ITerminalProfileObject, ITerminalsLayoutInfo, ITerminalsLayoutInfoById, TerminalIcon, TerminalLocationString, ITerminalProperty, TerminalShellType, TitleEventSource } from 'vs/platform/terminal/common/terminal';
import { IProcessDataEvent, IProcessReadyEvent, IShellLaunchConfig, ITerminalChildProcess, ITerminalDimensions, ITerminalDimensionsOverride, ITerminalLaunchError, ITerminalProfile, ITerminalProfileObject, ITerminalsLayoutInfo, ITerminalsLayoutInfoById, TerminalIcon, TerminalLocationString, TerminalProperty, TerminalShellType, TitleEventSource } from 'vs/platform/terminal/common/terminal';
import { IEnvironmentVariableInfo } from 'vs/workbench/contrib/terminal/common/environmentVariable';
import { createDecorator } from 'vs/platform/instantiation/common/instantiation';
import { URI } from 'vs/base/common/uri';
@@ -291,13 +291,13 @@ export interface ITerminalProcessManager extends IDisposable {
readonly onBeforeProcessData: Event<IBeforeProcessDataEvent>;
readonly onProcessData: Event<IProcessDataEvent>;
readonly onProcessTitle: Event<string>;
readonly onDidChangeProperty: Event<TerminalProperty>;
readonly onProcessShellTypeChanged: Event<TerminalShellType>;
readonly onProcessExit: Event<number | undefined>;
readonly onProcessOverrideDimensions: Event<ITerminalDimensionsOverride | undefined>;
readonly onProcessResolvedShellLaunchConfig: Event<IShellLaunchConfig>;
readonly onProcessDidChangeHasChildProcesses: Event<boolean>;
readonly onEnvironmentVariableInfoChanged: Event<IEnvironmentVariableInfo>;
readonly onDidChangeProperty: Event<ITerminalProperty<any>>;
dispose(immediate?: boolean): void;
detachFromProcess(): Promise<void>;
@@ -6,7 +6,7 @@
import { Emitter } from 'vs/base/common/event';
import { Disposable } from 'vs/base/common/lifecycle';
import { ILocalPtyService } from 'vs/platform/terminal/electron-sandbox/terminal';
import { IProcessDataEvent, IProcessReadyEvent, IShellLaunchConfig, ITerminalChildProcess, ITerminalDimensionsOverride, ITerminalLaunchError, ITerminalProperty, TerminalPropertyType, TerminalShellType } from 'vs/platform/terminal/common/terminal';
import { IProcessDataEvent, IProcessReadyEvent, IShellLaunchConfig, ITerminalChildProcess, ITerminalDimensionsOverride, ITerminalLaunchError, TerminalProperty, TerminalPropertyType, TerminalShellType } from 'vs/platform/terminal/common/terminal';
import { IPtyHostProcessReplayEvent } from 'vs/platform/terminal/common/terminalProcess';
/**
@@ -15,10 +15,8 @@ import { IPtyHostProcessReplayEvent } from 'vs/platform/terminal/common/terminal
*/
export class LocalPty extends Disposable implements ITerminalChildProcess {
private _inReplay = false;
private _properties: {
cwd: string;
initialCwd: string
};
initialCwd: string | undefined = undefined;
cwd: string | undefined = undefined;
private readonly _onProcessData = this._register(new Emitter<IProcessDataEvent | string>());
readonly onProcessData = this._onProcessData.event;
private readonly _onProcessReplay = this._register(new Emitter<IPtyHostProcessReplayEvent>());
@@ -37,7 +35,7 @@ export class LocalPty extends Disposable implements ITerminalChildProcess {
readonly onProcessShellTypeChanged = this._onProcessShellTypeChanged.event;
private readonly _onDidChangeHasChildProcesses = this._register(new Emitter<boolean>());
readonly onDidChangeHasChildProcesses = this._onDidChangeHasChildProcesses.event;
private readonly _onDidChangeProperty = this._register(new Emitter<ITerminalProperty<any>>());
private readonly _onDidChangeProperty = this._register(new Emitter<TerminalProperty>());
readonly onDidChangeProperty = this._onDidChangeProperty.event;
constructor(
@@ -46,10 +44,6 @@ export class LocalPty extends Disposable implements ITerminalChildProcess {
@ILocalPtyService private readonly _localPtyService: ILocalPtyService
) {
super();
this._properties = {
cwd: '',
initialCwd: ''
};
}
start(): Promise<ITerminalLaunchError | undefined> {
@@ -80,10 +74,18 @@ export class LocalPty extends Disposable implements ITerminalChildProcess {
this._localPtyService.resize(this.id, cols, rows);
}
async getInitialCwd(): Promise<string> {
return this._properties.initialCwd;
if (!this.initialCwd) {
this.initialCwd = await this._localPtyService.getInitialCwd(this.id);
}
return this.initialCwd;
}
async getCwd(): Promise<string> {
return this._properties.cwd || this._properties.initialCwd;
const cwd = await this._localPtyService.getCwd(this.id);
if (this.cwd !== cwd) {
this.cwd = cwd;
this.handleDidChangeProperty({ type: TerminalPropertyType.cwd, value: this.cwd });
}
return this.cwd;
}
getLatency(): Promise<number> {
// TODO: The idea here was to add the result plus the time it took to get the latency
@@ -123,12 +125,7 @@ export class LocalPty extends Disposable implements ITerminalChildProcess {
handleDidChangeHasChildProcesses(e: boolean) {
this._onDidChangeHasChildProcesses.fire(e);
}
handleDidChangeProperty(e: ITerminalProperty<any>) {
if (e.type === TerminalPropertyType.Cwd) {
this._properties.cwd = e.value;
} else if (e.type === TerminalPropertyType.InitialCwd) {
this._properties.initialCwd = e.value;
}
handleDidChangeProperty(e: TerminalProperty) {
this._onDidChangeProperty.fire(e);
}
@@ -66,7 +66,7 @@ export class LocalTerminalService extends Disposable implements ILocalTerminalSe
this._localPtyService.onProcessOverrideDimensions(e => this._ptys.get(e.id)?.handleOverrideDimensions(e.event));
this._localPtyService.onProcessResolvedShellLaunchConfig(e => this._ptys.get(e.id)?.handleResolvedShellLaunchConfig(e.event));
this._localPtyService.onProcessDidChangeHasChildProcesses(e => this._ptys.get(e.id)?.handleDidChangeHasChildProcesses(e.event));
this._localPtyService.onDidChangeProperty(e => this._ptys.get(e.id)?.handleDidChangeProperty(e.property));
this._localPtyService.onDidChangeProperty(e => this._ptys.get(e.id)?.handleDidChangeProperty(e.event));
this._localPtyService.onProcessReplay(e => this._ptys.get(e.id)?.handleReplay(e.event));
this._localPtyService.onProcessOrphanQuestion(e => this._ptys.get(e.id)?.handleOrphanQuestion());
this._localPtyService.onDidRequestDetach(e => this._onDidRequestDetach.fire(e));