Add queue system
This commit is contained in:
parent
29303c819d
commit
c35b88a7a2
1 changed files with 36 additions and 6 deletions
|
@ -22,6 +22,7 @@ import { ExtHostVariableResolverService } from 'vs/workbench/api/node/extHostDeb
|
||||||
import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors';
|
import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors';
|
||||||
import { getSystemShell, detectAvailableShells } from 'vs/workbench/contrib/terminal/node/terminal';
|
import { getSystemShell, detectAvailableShells } from 'vs/workbench/contrib/terminal/node/terminal';
|
||||||
import { getMainProcessParentEnv } from 'vs/workbench/contrib/terminal/node/terminalEnvironment';
|
import { getMainProcessParentEnv } from 'vs/workbench/contrib/terminal/node/terminalEnvironment';
|
||||||
|
import { IDisposable } from 'vs/base/common/lifecycle';
|
||||||
|
|
||||||
const RENDERER_NO_PROCESS_ID = -1;
|
const RENDERER_NO_PROCESS_ID = -1;
|
||||||
|
|
||||||
|
@ -329,7 +330,11 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape {
|
||||||
public createVirtualProcessTerminal(options: vscode.TerminalVirtualProcessOptions): vscode.Terminal {
|
public createVirtualProcessTerminal(options: vscode.TerminalVirtualProcessOptions): vscode.Terminal {
|
||||||
const terminal = new ExtHostTerminal(this._proxy, options.name);
|
const terminal = new ExtHostTerminal(this._proxy, options.name);
|
||||||
const p = new ExtHostVirtualProcess(options.virtualProcess);
|
const p = new ExtHostVirtualProcess(options.virtualProcess);
|
||||||
terminal.createVirtualProcess().then(() => this._setupExtHostProcessListeners(terminal._id, p));
|
terminal.createVirtualProcess().then(() => {
|
||||||
|
this._setupExtHostProcessListeners(terminal._id, p);
|
||||||
|
// TODO: Why isn't 1 being send from extension?
|
||||||
|
p.startSendingEvents();
|
||||||
|
});
|
||||||
this._terminals.push(terminal);
|
this._terminals.push(terminal);
|
||||||
return terminal;
|
return terminal;
|
||||||
}
|
}
|
||||||
|
@ -699,6 +704,9 @@ class ApiRequest {
|
||||||
}
|
}
|
||||||
|
|
||||||
class ExtHostVirtualProcess implements ITerminalChildProcess {
|
class ExtHostVirtualProcess implements ITerminalChildProcess {
|
||||||
|
private _queuedEvents: (IQueuedEvent<string> | IQueuedEvent<number> | IQueuedEvent<{ pid: number, cwd: string }>)[] = [];
|
||||||
|
private _queueDisposables: IDisposable[] | undefined;
|
||||||
|
|
||||||
private readonly _onProcessData = new Emitter<string>();
|
private readonly _onProcessData = new Emitter<string>();
|
||||||
public get onProcessData(): Event<string> { return this._onProcessData.event; }
|
public get onProcessData(): Event<string> { return this._onProcessData.event; }
|
||||||
private readonly _onProcessExit = new Emitter<number>();
|
private readonly _onProcessExit = new Emitter<number>();
|
||||||
|
@ -711,13 +719,13 @@ class ExtHostVirtualProcess implements ITerminalChildProcess {
|
||||||
constructor(
|
constructor(
|
||||||
private readonly _virtualProcess: vscode.TerminalVirtualProcess
|
private readonly _virtualProcess: vscode.TerminalVirtualProcess
|
||||||
) {
|
) {
|
||||||
// TODO: Events need to be buffered until the terminal id is set
|
this._queueDisposables = [];
|
||||||
this._virtualProcess.write(e => this._onProcessData.fire(e));
|
this._queueDisposables.push(this._virtualProcess.write(e => this._queuedEvents.push({ emitter: this._onProcessData, data: e })));
|
||||||
if (this._virtualProcess.exit) {
|
if (this._virtualProcess.exit) {
|
||||||
this._virtualProcess.exit(e => this._onProcessExit.fire(e));
|
this._queueDisposables.push(this._virtualProcess.exit(e => this._queuedEvents.push({ emitter: this._onProcessExit, data: e })));
|
||||||
}
|
}
|
||||||
|
// TODO: Handle overrideDimensions, use an optional event on the interface?
|
||||||
if (this._virtualProcess.overrideDimensions) {
|
if (this._virtualProcess.overrideDimensions) {
|
||||||
// TODO: Implement this
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -752,4 +760,26 @@ class ExtHostVirtualProcess implements ITerminalChildProcess {
|
||||||
return Promise.resolve(0);
|
return Promise.resolve(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
startSendingEvents(): void {
|
||||||
|
// Flush all buffered events
|
||||||
|
this._queuedEvents.forEach(e => {
|
||||||
|
e.emitter.fire(<any>e.data);
|
||||||
|
});
|
||||||
|
this._queuedEvents = [];
|
||||||
|
this._queueDisposables = undefined;
|
||||||
|
|
||||||
|
// Attach the real listeners
|
||||||
|
this._virtualProcess.write(e => this._onProcessData.fire(e));
|
||||||
|
if (this._virtualProcess.exit) {
|
||||||
|
this._virtualProcess.exit(e => this._onProcessExit.fire(e));
|
||||||
|
}
|
||||||
|
if (this._virtualProcess.overrideDimensions) {
|
||||||
|
// TODO: Implement this
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
interface IQueuedEvent<T> {
|
||||||
|
emitter: Emitter<T>;
|
||||||
|
data: T;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue