diff --git a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts index 9a974a203d8..2901cc6a637 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts @@ -146,11 +146,10 @@ export function registerTerminalActions() { precondition: TerminalContextKeys.processSupported }); } - async run(accessor: ServicesAccessor) { + async run(accessor: ServicesAccessor, args?: unknown) { const terminalService = accessor.get(ITerminalService); - const instance = await terminalService.createTerminal({ - location: TerminalLocation.Editor - }); + const options = (typeof args === 'object' && args && 'location' in args) ? args as ICreateTerminalOptions : { location: TerminalLocation.Editor }; + const instance = await terminalService.createTerminal(options); instance.focusWhenReady(); } }); diff --git a/src/vs/workbench/contrib/terminal/browser/terminalEditor.ts b/src/vs/workbench/contrib/terminal/browser/terminalEditor.ts index 5378eddcc56..5da5960a2ef 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalEditor.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalEditor.ts @@ -31,7 +31,7 @@ import { BrowserFeatures } from 'vs/base/browser/canIUse'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { openContextMenu } from 'vs/workbench/contrib/terminal/browser/terminalContextMenu'; import { ICommandService } from 'vs/platform/commands/common/commands'; -import { TerminalLocation } from 'vs/platform/terminal/common/terminal'; +import { ACTIVE_GROUP } from 'vs/workbench/services/editor/common/editorService'; const findWidgetSelector = '.simple-find-part-wrapper'; @@ -201,7 +201,8 @@ export class TerminalEditor extends EditorPane { override getActionViewItem(action: IAction): IActionViewItem | undefined { switch (action.id) { case TerminalCommandId.CreateWithProfileButton: { - const actions = getTerminalActionBarArgs(TerminalLocation.Editor, this._terminalService.availableProfiles, this._getDefaultProfileName(), this._terminalContributionService.terminalProfiles, this._instantiationService, this._terminalService, this._contextKeyService, this._commandService, this._dropdownMenu); + const location = { viewColumn: ACTIVE_GROUP }; + const actions = getTerminalActionBarArgs(location, this._terminalService.availableProfiles, this._getDefaultProfileName(), this._terminalContributionService.terminalProfiles, this._instantiationService, this._terminalService, this._contextKeyService, this._commandService, this._dropdownMenu); const button = this._instantiationService.createInstance(DropdownWithPrimaryActionViewItem, actions.primaryAction, actions.dropdownAction, actions.dropdownMenuActions, actions.className, this._contextMenuService, {}); return button; } diff --git a/src/vs/workbench/contrib/terminal/browser/terminalMenus.ts b/src/vs/workbench/contrib/terminal/browser/terminalMenus.ts index 5aaab86b38b..d4679dfdecc 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalMenus.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalMenus.ts @@ -13,7 +13,7 @@ import { ContextKeyAndExpr, ContextKeyEqualsExpr, ContextKeyExpr, IContextKeySer import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IExtensionTerminalProfile, ITerminalProfile, TerminalLocation, TerminalSettingId } from 'vs/platform/terminal/common/terminal'; import { ResourceContextKey } from 'vs/workbench/common/resources'; -import { ICreateTerminalOptions, ITerminalService } from 'vs/workbench/contrib/terminal/browser/terminal'; +import { ICreateTerminalOptions, ITerminalLocationOptions, ITerminalService } from 'vs/workbench/contrib/terminal/browser/terminal'; import { TerminalCommandId, TERMINAL_VIEW_ID } from 'vs/workbench/contrib/terminal/common/terminal'; import { TerminalContextKeys, TerminalContextKeyStrings } from 'vs/workbench/contrib/terminal/common/terminalContextKey'; import { terminalStrings } from 'vs/workbench/contrib/terminal/common/terminalStrings'; @@ -572,7 +572,7 @@ export function setupTerminalMenus(): void { }); } -export function getTerminalActionBarArgs(location: TerminalLocation, profiles: ITerminalProfile[], defaultProfileName: string, contributedProfiles: readonly IExtensionTerminalProfile[], instantiationService: IInstantiationService, terminalService: ITerminalService, contextKeyService: IContextKeyService, commandService: ICommandService, dropdownMenu: IMenu): { +export function getTerminalActionBarArgs(location: ITerminalLocationOptions, profiles: ITerminalProfile[], defaultProfileName: string, contributedProfiles: readonly IExtensionTerminalProfile[], instantiationService: IInstantiationService, terminalService: ITerminalService, contextKeyService: IContextKeyService, commandService: ICommandService, dropdownMenu: IMenu): { primaryAction: MenuItemAction, dropdownAction: IAction, dropdownMenuActions: IAction[], @@ -611,7 +611,7 @@ export function getTerminalActionBarArgs(location: TerminalLocation, profiles: I }, location }))); - const splitLocation = location === TerminalLocation.Editor ? { viewColumn: SIDE_GROUP } : location; + const splitLocation = (location === TerminalLocation.Editor || typeof location === 'object' && 'viewColumn' in location) ? { viewColumn: SIDE_GROUP } : location; 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 a3937089afd..9d48153bfc2 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalService.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalService.ts @@ -48,6 +48,8 @@ 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 { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; export class TerminalService implements ITerminalService { declare _serviceBrand: undefined; @@ -173,6 +175,7 @@ export class TerminalService implements ITerminalService { @ITerminalGroupService private readonly _terminalGroupService: ITerminalGroupService, @ITerminalInstanceService private readonly _terminalInstanceService: ITerminalInstanceService, @IEditorResolverService editorResolverService: IEditorResolverService, + @IEditorGroupsService private readonly _editorGroupsService: IEditorGroupsService, @IExtensionService private readonly _extensionService: IExtensionService, @INotificationService private readonly _notificationService: INotificationService, @IThemeService private readonly _themeService: IThemeService, @@ -1237,6 +1240,11 @@ export class TerminalService implements ITerminalService { private _getEditorOptions(location?: ITerminalLocationOptions): TerminalEditorLocation | undefined { if (location && typeof location === 'object' && 'viewColumn' in location) { + // When ACTIVE_GROUP is used, resolve it to an actual group to ensure the is created in + // the active group even if it is locked + if (location.viewColumn === ACTIVE_GROUP) { + location.viewColumn = this._editorGroupsService.activeGroup.index; + } return location; } return undefined;