提交 f542cd1f 编写于 作者: D Daniel Imms

Queue initial term data events for ext host delayed init

Fixes #103697
上级 1a4999bb
......@@ -154,6 +154,10 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape
this._dataEventTracker = this._instantiationService.createInstance(TerminalDataEventTracker, (id, data) => {
this._onTerminalData(id, data);
});
// Send initial events if they exist
this._terminalService.terminalInstances.forEach(t => {
t.initialDataEvents?.forEach(d => this._onTerminalData(t.id, d));
});
}
}
......
......@@ -287,6 +287,14 @@ export interface ITerminalInstance {
readonly areLinksReady: boolean;
/**
* Returns an array of data events that have fired within the first 10 seconds. If this is
* called 10 seconds after the terminal has existed the result will be undefined. This is useful
* when objects that depend on the data events have delayed initialization, like extension
* hosts.
*/
readonly initialDataEvents: string[] | undefined;
/** A promise that resolves when the terminal's pty/process have been created. */
processReady: Promise<void>;
......
......@@ -98,6 +98,7 @@ export class TerminalInstance extends Disposable implements ITerminalInstance {
private _titleReadyPromise: Promise<string>;
private _titleReadyComplete: ((title: string) => any) | undefined;
private _areLinksReady: boolean = false;
private _initialDataEvents: string[] | undefined = [];
private _messageTitleDisposable: IDisposable | undefined;
......@@ -131,6 +132,7 @@ export class TerminalInstance extends Disposable implements ITerminalInstance {
// TODO: Should this be an event as it can fire twice?
public get processReady(): Promise<void> { return this._processManager.ptyProcessReady; }
public get areLinksReady(): boolean { return this._areLinksReady; }
public get initialDataEvents(): string[] | undefined { return this._initialDataEvents; }
public get exitCode(): number | undefined { return this._exitCode; }
public get title(): string { return this._title; }
public get hadFocusOnExit(): boolean { return this._hadFocusOnExit; }
......@@ -231,6 +233,20 @@ export class TerminalInstance extends Disposable implements ITerminalInstance {
this.updateAccessibilitySupport();
}
}));
// Clear out initial data events after 10 seconds, hopefully extension hosts are up and
// running at that point.
let initialDataEventsTimeout: NodeJS.Timeout | undefined = setTimeout(() => {
initialDataEventsTimeout = undefined;
this._initialDataEvents = undefined;
}, 10000);
this._register({
dispose: () => {
if (initialDataEventsTimeout) {
clearTimeout(initialDataEventsTimeout);
}
}
});
}
public addDisposable(disposable: IDisposable): void {
......@@ -862,11 +878,12 @@ export class TerminalInstance extends Disposable implements ITerminalInstance {
protected _createProcessManager(): void {
this._processManager = this._instantiationService.createInstance(TerminalProcessManager, this._id, this._configHelper);
this._processManager.onProcessReady(() => {
this._onProcessIdReady.fire(this);
});
this._processManager.onProcessReady(() => this._onProcessIdReady.fire(this));
this._processManager.onProcessExit(exitCode => this._onProcessExit(exitCode));
this._processManager.onProcessData(data => this._onData.fire(data));
this._processManager.onProcessData(data => {
this._initialDataEvents?.push(data);
this._onData.fire(data);
});
this._processManager.onProcessOverrideDimensions(e => this.setDimensions(e));
this._processManager.onProcessResolvedShellLaunchConfig(e => this._setResolvedShellLaunchConfig(e));
this._processManager.onEnvironmentVariableInfoChanged(e => this._onEnvironmentVariableInfoChanged(e));
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册