From 497cc70f2ff6ac91bc3bf92a04d74d281d0faebc Mon Sep 17 00:00:00 2001 From: Daniel Imms Date: Mon, 16 Apr 2018 07:38:28 -0700 Subject: [PATCH] Move process title handling into manager --- .../parts/terminal/common/terminal.ts | 1 + .../electron-browser/terminalInstance.ts | 22 +++++------- .../terminalProcessManager.ts | 36 ++++++++++++------- 3 files changed, 33 insertions(+), 26 deletions(-) diff --git a/src/vs/workbench/parts/terminal/common/terminal.ts b/src/vs/workbench/parts/terminal/common/terminal.ts index 6443b97ce53..2e29ed09e99 100644 --- a/src/vs/workbench/parts/terminal/common/terminal.ts +++ b/src/vs/workbench/parts/terminal/common/terminal.ts @@ -473,6 +473,7 @@ export interface ITerminalProcessManager extends IDisposable { onProcessReady: Event; onProcessData: Event; + onProcessTitle: Event; onProcessExit: Event; addDisposable(disposable: IDisposable); diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts index 48e56ec52cf..f6929d3cfb2 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts @@ -51,19 +51,20 @@ export class TerminalInstance implements ITerminalInstance { private _isDisposed: boolean; private _skipTerminalCommands: string[]; private _title: string; - // TODO: Rename to "_disposables" - private _instanceDisposables: lifecycle.IDisposable[]; private _wrapperElement: HTMLDivElement; private _xterm: XTermTerminal; private _xtermElement: HTMLDivElement; private _terminalHasTextContextKey: IContextKey; private _cols: number; private _rows: number; - private _messageTitleListener: (message: { type: string, content: string }) => void; private _windowsShellHelper: WindowsShellHelper; private _onLineDataListeners: ((lineData: string) => void)[]; private _xtermReadyPromise: TPromise; + // TODO: Rename to "_disposables" + private _instanceDisposables: lifecycle.IDisposable[]; + private _messageTitleDisposable: lifecycle.IDisposable; + private _widgetManager: TerminalWidgetManager; private _linkHandler: TerminalLinkHandler; private _commandTracker: TerminalCommandTracker; @@ -76,7 +77,7 @@ export class TerminalInstance implements ITerminalInstance { public get processReady(): TPromise { return this._processManager.ptyProcessReady; } public get title(): string { return this._title; } public get hadFocusOnExit(): boolean { return this._hadFocusOnExit; } - public get isTitleSetByProcess(): boolean { return !!this._messageTitleListener; } + public get isTitleSetByProcess(): boolean { return !!this._messageTitleDisposable; } public get shellLaunchConfig(): IShellLaunchConfig { return Object.freeze(this._shellLaunchConfig); } public get commandTracker(): TerminalCommandTracker { return this._commandTracker; } @@ -593,12 +594,7 @@ export class TerminalInstance implements ITerminalInstance { } else { // Only listen for process title changes when a name is not provided this.setTitle(this._shellLaunchConfig.executable, true); - this._messageTitleListener = (message) => { - if (message.type === 'title') { - this.setTitle(message.content ? message.content : '', true); - } - }; - this._processManager.process.on('message', this._messageTitleListener); + this._messageTitleDisposable = this._processManager.onProcessTitle(title => this.setTitle(title ? title : '', true)); } if (platform.isWindows) { @@ -922,9 +918,9 @@ export class TerminalInstance implements ITerminalInstance { } else { // If the title has not been set by the API or the rename command, unregister the handler that // automatically updates the terminal name - if (this._processManager.process && this._messageTitleListener) { - this._processManager.process.removeListener('message', this._messageTitleListener); - this._messageTitleListener = null; + if (this._messageTitleDisposable) { + lifecycle.dispose(this._messageTitleDisposable); + this._messageTitleDisposable = null; } } const didTitleChange = title !== this._title; diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalProcessManager.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalProcessManager.ts index 8136510b609..f2a3bf7e781 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalProcessManager.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalProcessManager.ts @@ -44,6 +44,8 @@ export class TerminalProcessManager implements ITerminalProcessManager { public get onProcessReady(): Event { return this._onProcessReady.event; } private readonly _onProcessData: Emitter = new Emitter(); public get onProcessData(): Event { return this._onProcessData.event; } + private readonly _onProcessTitle: Emitter = new Emitter(); + public get onProcessTitle(): Event { return this._onProcessTitle.event; } private readonly _onProcessExit: Emitter = new Emitter(); public get onProcessExit(): Event { return this._onProcessExit.event; } @@ -168,20 +170,28 @@ export class TerminalProcessManager implements ITerminalProcessManager { } private _onMessage(message: ITerminalProcessMessage): void { - if (message.type === 'pid') { - this.shellProcessId = message.content; - this._onProcessReady.fire(); + switch (message.type) { + case 'data': + this._onProcessData.fire(message.content); + break; + case 'pid': + this.shellProcessId = message.content; + this._onProcessReady.fire(); - // Send any queued data that's waiting - if (this._preLaunchInputQueue.length > 0) { - this.process.send({ - event: 'input', - data: this._preLaunchInputQueue.join('') - }); - this._preLaunchInputQueue.length = 0; - } - } else if (message.type === 'data') { - this._onProcessData.fire(message.content); + // Send any queued data that's waiting + if (this._preLaunchInputQueue.length > 0) { + this.process.send({ + event: 'input', + data: this._preLaunchInputQueue.join('') + }); + this._preLaunchInputQueue.length = 0; + } + break; + case 'title': + this._onProcessTitle.fire(message.content); + break; + default: + this._logService.error(`Unrecognized message from pty (shellProcessId: ${this.shellProcessId}`, message); } }