diff --git a/src/vs/workbench/api/common/extHostTerminalService.ts b/src/vs/workbench/api/common/extHostTerminalService.ts index 1d9d7343e1e..94d494594cc 100644 --- a/src/vs/workbench/api/common/extHostTerminalService.ts +++ b/src/vs/workbench/api/common/extHostTerminalService.ts @@ -151,7 +151,7 @@ export class ExtHostTerminal { isFeatureTerminal: withNullAsUndefined(internalOptions?.isFeatureTerminal), isExtensionOwnedTerminal: true, useShellEnvironment: withNullAsUndefined(internalOptions?.useShellEnvironment), - location: internalOptions?.location || this._serializeParentTerminal(options.location, internalOptions?.resolvedExtHostIdentifier, internalOptions?.location) + location: internalOptions?.location || this._serializeParentTerminal(options.location, internalOptions?.resolvedExtHostIdentifier) }); } @@ -174,12 +174,19 @@ export class ExtHostTerminal { return this._id; } - private _serializeParentTerminal(location?: TerminalLocation | vscode.TerminalEditorLocationOptions | vscode.TerminalSplitLocationOptions | { splitActiveTerminal: boolean }, parentTerminal?: ExtHostTerminalIdentifier, internalLocation?: TerminalLocation | { viewColumn: number, preserveState?: boolean } | { splitActiveTerminal: boolean }): TerminalLocation | vscode.TerminalEditorLocationOptions | { parentTerminal: ExtHostTerminalIdentifier } | { splitActiveTerminal: boolean } | vscode.TerminalEditorLocationOptions | undefined { - if (typeof location === 'object' && 'parentTerminal' in location) { - return parentTerminal ? { parentTerminal } : undefined; - } else if (internalLocation) { - location = internalLocation; + private _serializeParentTerminal(location?: TerminalLocation | vscode.TerminalEditorLocationOptions | vscode.TerminalSplitLocationOptions, parentTerminal?: ExtHostTerminalIdentifier): TerminalLocation | vscode.TerminalEditorLocationOptions | { parentTerminal: ExtHostTerminalIdentifier } | undefined { + if (typeof location === 'object') { + if ('parentTerminal' in location && location.parentTerminal && parentTerminal) { + return { parentTerminal }; + } + + if ('viewColumn' in location) { + return { viewColumn: location.viewColumn, preserveFocus: location.preserveFocus }; + } + + return undefined; } + return location; } @@ -414,7 +421,7 @@ export abstract class BaseExtHostTerminalService extends Disposable implements I public createExtensionTerminal(options: vscode.ExtensionTerminalOptions, internalOptions?: ITerminalInternalOptions): vscode.Terminal { const terminal = new ExtHostTerminal(this._proxy, generateUuid(), options, options.name); const p = new ExtHostPseudoterminal(options.pty); - terminal.createExtensionTerminal(this._resolveLocation(options.location), internalOptions?.resolvedExtHostIdentifier, asTerminalIcon(options.iconPath), asTerminalColor(options.color)).then(id => { + terminal.createExtensionTerminal(options.location, this._serializeParentTerminal(options, internalOptions).resolvedExtHostIdentifier, asTerminalIcon(options.iconPath), asTerminalColor(options.color)).then(id => { const disposable = this._setupExtHostProcessListeners(id, p); this._terminalProcessDisposables[id] = disposable; }); @@ -422,17 +429,22 @@ export abstract class BaseExtHostTerminalService extends Disposable implements I return terminal.value; } - private _resolveLocation(location?: TerminalLocation | vscode.TerminalEditorLocationOptions | vscode.TerminalSplitLocationOptions): undefined | TerminalLocation | vscode.TerminalEditorLocationOptions { - if (typeof location === 'object' && 'viewColumn' in location && location.viewColumn !== undefined) { - return { viewColumn: location.viewColumn, preserveFocus: location.preserveFocus }; - } else if (typeof location === 'object' && 'parentTerminal' in location) { - // parent terminal exthost ID is passed in internal options - // for conversion to TerminalInstance in mainThreadTerminalService - return undefined; - } else if (location === TerminalLocation.Editor || location === TerminalLocation.Panel) { - return location; + protected _serializeParentTerminal(options: vscode.TerminalOptions, internalOptions?: ITerminalInternalOptions): ITerminalInternalOptions { + internalOptions = internalOptions ? internalOptions : {}; + if (options.location && typeof options.location === 'object' && 'parentTerminal' in options.location) { + const parentTerminal = options.location.parentTerminal; + if (parentTerminal) { + const parentExtHostTerminal = this._terminals.find(t => t.value === parentTerminal); + if (parentExtHostTerminal) { + internalOptions.resolvedExtHostIdentifier = parentExtHostTerminal._id; + } + } + } else if (options.location && typeof options.location !== 'object') { + internalOptions.location = options.location; + } else if (internalOptions.location && typeof internalOptions.location === 'object' && 'splitActiveTerminal' in internalOptions.location) { + internalOptions.location = { splitActiveTerminal: true }; } - return location; + return internalOptions; } public attachPtyToTerminal(id: number, pty: vscode.Pseudoterminal): void { diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index f772199a6df..3937478922b 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -26,22 +26,4 @@ export class ExtHostTerminalService extends BaseExtHostTerminalService { terminal.create(options, this._serializeParentTerminal(options, internalOptions)); return terminal.value; } - - private _serializeParentTerminal(options: vscode.TerminalOptions, internalOptions?: ITerminalInternalOptions): ITerminalInternalOptions { - internalOptions = internalOptions ? internalOptions : {}; - if (options.location && typeof options.location === 'object' && 'parentTerminal' in options.location) { - const parentTerminal = options.location.parentTerminal; - if (parentTerminal) { - const parentExtHostTerminal = this._terminals.find(t => t.value === parentTerminal); - if (parentExtHostTerminal) { - internalOptions.resolvedExtHostIdentifier = parentExtHostTerminal._id; - } - } - } else if (options.location && typeof options.location !== 'object') { - internalOptions.location = options.location; - } else if (internalOptions.location && typeof internalOptions.location === 'object' && 'splitActiveTerminal' in internalOptions.location) { - internalOptions.location = { splitActiveTerminal: true }; - } - return internalOptions; - } }