Allow 100ms for terminal container to become available before spawn
Fixes #117188
This commit is contained in:
parent
a05c63db4f
commit
a802d1f9df
1 changed files with 19 additions and 1 deletions
|
@ -50,12 +50,22 @@ import { IEnvironmentVariableInfo } from 'vs/workbench/contrib/terminal/common/e
|
|||
import { IProcessDataEvent, IShellLaunchConfig, ITerminalDimensionsOverride, ITerminalLaunchError, TerminalShellType } from 'vs/platform/terminal/common/terminal';
|
||||
import { IProductService } from 'vs/platform/product/common/productService';
|
||||
import { formatMessageForTerminal } from 'vs/workbench/contrib/terminal/common/terminalStrings';
|
||||
import { AutoOpenBarrier } from 'vs/base/common/async';
|
||||
|
||||
// How long in milliseconds should an average frame take to render for a notification to appear
|
||||
// which suggests the fallback DOM-based renderer
|
||||
const SLOW_CANVAS_RENDER_THRESHOLD = 50;
|
||||
const NUMBER_OF_FRAMES_TO_MEASURE = 20;
|
||||
|
||||
const enum Constants {
|
||||
/**
|
||||
* The maximum amount of milliseconds to wait for a container before starting to create the
|
||||
* terminal process. This period helps ensure the terminal has good initial dimensions to work
|
||||
* with if it's going to be a foreground terminal.
|
||||
*/
|
||||
WaitForContainerThreshold = 100
|
||||
}
|
||||
|
||||
let xtermConstructor: Promise<typeof XTermTerminal> | undefined;
|
||||
|
||||
interface ICanvasDimensions {
|
||||
|
@ -106,6 +116,7 @@ export class TerminalInstance extends Disposable implements ITerminalInstance {
|
|||
private _titleReadyComplete: ((title: string) => any) | undefined;
|
||||
private _areLinksReady: boolean = false;
|
||||
private _initialDataEvents: string[] | undefined = [];
|
||||
private _containerReadyBarrier: AutoOpenBarrier;
|
||||
|
||||
private _messageTitleDisposable: IDisposable | undefined;
|
||||
|
||||
|
@ -232,8 +243,12 @@ export class TerminalInstance extends Disposable implements ITerminalInstance {
|
|||
this._initDimensions();
|
||||
this._createProcessManager();
|
||||
|
||||
this._containerReadyBarrier = new AutoOpenBarrier(Constants.WaitForContainerThreshold);
|
||||
this._xtermReadyPromise = this._createXterm();
|
||||
this._xtermReadyPromise.then(() => {
|
||||
this._xtermReadyPromise.then(async () => {
|
||||
// Wait for a period to allow a container to be ready
|
||||
await this._containerReadyBarrier.wait();
|
||||
|
||||
// Only attach xterm.js to the DOM if the terminal panel has been opened before.
|
||||
if (_container) {
|
||||
this._attachToElement(_container);
|
||||
|
@ -1402,6 +1417,9 @@ export class TerminalInstance extends Disposable implements ITerminalInstance {
|
|||
}
|
||||
|
||||
this._resize();
|
||||
|
||||
// Signal the container is ready
|
||||
this._containerReadyBarrier.open();
|
||||
}
|
||||
|
||||
@debounce(50)
|
||||
|
|
Loading…
Reference in a new issue