diff --git a/src/vs/platform/terminal/common/terminal.ts b/src/vs/platform/terminal/common/terminal.ts index 3ae78ec6ef7..ce490c34cb8 100644 --- a/src/vs/platform/terminal/common/terminal.ts +++ b/src/vs/platform/terminal/common/terminal.ts @@ -395,6 +395,7 @@ export interface ICreateContributedTerminalProfileOptions { icon?: URI | string | { light: URI, dark: URI }; color?: string; splitActiveTerminal?: boolean; + location?: TerminalLocation | { viewColumn: number, preserveState?: boolean }; } export enum TerminalLocation { diff --git a/src/vs/workbench/api/browser/mainThreadTerminalService.ts b/src/vs/workbench/api/browser/mainThreadTerminalService.ts index 7029bcd3855..78918977c74 100644 --- a/src/vs/workbench/api/browser/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/browser/mainThreadTerminalService.ts @@ -149,7 +149,7 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape })); } - private async _deserializeParentTerminal(location?: TerminalLocation | TerminalEditorLocationOptions | { parentTerminal: ExtHostTerminalIdentifier } | { splitActiveTerminal: boolean }): Promise { + private async _deserializeParentTerminal(location?: TerminalLocation | TerminalEditorLocationOptions | { parentTerminal: ExtHostTerminalIdentifier } | { splitActiveTerminal: boolean, location?: TerminalLocation }): Promise { if (typeof location === 'object' && 'parentTerminal' in location) { const parentTerminal = await this._extHostTerminals.get(location.parentTerminal.toString()); return parentTerminal ? { parentTerminal } : undefined; diff --git a/src/vs/workbench/api/common/extHostTerminalService.ts b/src/vs/workbench/api/common/extHostTerminalService.ts index f78b6ec3ac3..187de79a5cc 100644 --- a/src/vs/workbench/api/common/extHostTerminalService.ts +++ b/src/vs/workbench/api/common/extHostTerminalService.ts @@ -53,6 +53,7 @@ export interface ITerminalInternalOptions { useShellEnvironment?: boolean; resolvedExtHostIdentifier?: ExtHostTerminalIdentifier; splitActiveTerminal?: boolean; + location?: TerminalLocation | { viewColumn: number, preserveState?: boolean } | { splitActiveTerminal: boolean }; } export const IExtHostTerminalService = createDecorator('IExtHostTerminalService'); @@ -147,7 +148,7 @@ export class ExtHostTerminal { isFeatureTerminal: withNullAsUndefined(internalOptions?.isFeatureTerminal), isExtensionOwnedTerminal: true, useShellEnvironment: withNullAsUndefined(internalOptions?.useShellEnvironment), - location: this._serializeParentTerminal(options.location, internalOptions?.resolvedExtHostIdentifier, internalOptions?.splitActiveTerminal) + location: internalOptions?.location || this._serializeParentTerminal(options.location, internalOptions?.resolvedExtHostIdentifier, internalOptions?.location) }); } @@ -170,11 +171,11 @@ export class ExtHostTerminal { return this._id; } - private _serializeParentTerminal(location?: TerminalLocation | vscode.TerminalEditorLocationOptions | vscode.TerminalSplitLocationOptions, parentTerminal?: ExtHostTerminalIdentifier, splitActiveTerminal?: boolean): TerminalLocation | vscode.TerminalEditorLocationOptions | { parentTerminal: ExtHostTerminalIdentifier } | { splitActiveTerminal: boolean } | undefined { + 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, location?: TerminalLocation } | vscode.TerminalEditorLocationOptions | undefined { if (typeof location === 'object' && 'parentTerminal' in location) { return parentTerminal ? { parentTerminal } : undefined; - } else if (splitActiveTerminal) { - return { splitActiveTerminal: true }; + } else if (internalLocation) { + location = internalLocation; } return location; } diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index dadc49d7e45..0bf428ab07c 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -6,6 +6,7 @@ import { generateUuid } from 'vs/base/common/uuid'; import { IExtHostRpcService } from 'vs/workbench/api/common/extHostRpcService'; import { BaseExtHostTerminalService, ExtHostTerminal, ITerminalInternalOptions } from 'vs/workbench/api/common/extHostTerminalService'; +import { TerminalLocation } from 'vs/workbench/api/common/extHostTypes'; import type * as vscode from 'vscode'; export class ExtHostTerminalService extends BaseExtHostTerminalService { @@ -37,6 +38,10 @@ export class ExtHostTerminalService extends BaseExtHostTerminalService { internalOptions.resolvedExtHostIdentifier = parentExtHostTerminal._id; } } + } else if (!internalOptions.splitActiveTerminal && options.location === TerminalLocation.Editor || options.location === TerminalLocation.Panel) { + internalOptions.location = options.location; + } else if (internalOptions.splitActiveTerminal) { + internalOptions.location = { splitActiveTerminal: true }; } return internalOptions; } diff --git a/src/vs/workbench/contrib/terminal/browser/terminalMenus.ts b/src/vs/workbench/contrib/terminal/browser/terminalMenus.ts index a761fa1bae4..1266ccb3b01 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalMenus.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalMenus.ts @@ -619,7 +619,7 @@ export function getTerminalActionBarArgs(location: ITerminalLocationOptions, pro }, location }))); - const splitLocation = (location === TerminalLocation.Editor || location === { viewColumn: ACTIVE_GROUP }) ? { viewColumn: SIDE_GROUP } : { splitActiveTerminal: true }; + const splitLocation = location === TerminalLocation.Editor ? { viewColumn: SIDE_GROUP } : { splitActiveTerminal: true }; submenuActions.push(new Action(TerminalCommandId.NewWithProfile, title, undefined, true, () => terminalService.createTerminal({ config: { extensionIdentifier: contributed.extensionIdentifier, diff --git a/src/vs/workbench/contrib/terminal/browser/terminalService.ts b/src/vs/workbench/contrib/terminal/browser/terminalService.ts index ac2187b50c0..6ab7d405950 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalService.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalService.ts @@ -48,7 +48,7 @@ import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/ import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { ILifecycleService, ShutdownReason, WillShutdownEvent } from 'vs/workbench/services/lifecycle/common/lifecycle'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; -import { ACTIVE_GROUP } from 'vs/workbench/services/editor/common/editorService'; +import { ACTIVE_GROUP, SIDE_GROUP } from 'vs/workbench/services/editor/common/editorService'; import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; export class TerminalService implements ITerminalService { @@ -951,7 +951,8 @@ export class TerminalService implements ITerminalService { await this._createContributedTerminalProfile(value.profile.extensionIdentifier, value.profile.id, { splitActiveTerminal: !!(keyMods?.alt && activeInstance), icon: value.profile.icon, - color: value.profile.color + color: value.profile.color, + location: this.defaultLocation }); return; } else { @@ -1156,10 +1157,13 @@ export class TerminalService implements ITerminalService { // Launch the contributed profile if (contributedProfile) { + const resolvedLocation = this._resolveLocation(options?.location); + const split = typeof options?.location === 'object' && 'splitActiveTerminal' in options.location ? options.location.splitActiveTerminal : false; await this._createContributedTerminalProfile(contributedProfile.extensionIdentifier, contributedProfile.id, { icon: contributedProfile.icon, color: contributedProfile.color, - splitActiveTerminal: typeof options?.location === 'object' && 'splitActiveTerminal' in options.location ? true : false + splitActiveTerminal: split, + location: resolvedLocation === TerminalLocation.Editor && split ? { viewColumn: SIDE_GROUP } : resolvedLocation }); const instanceHost = this._resolveLocation(options?.location) === TerminalLocation.Editor ? this._terminalEditorService : this._terminalGroupService; const instance = instanceHost.instances[instanceHost.instances.length - 1];