Force new terminal editor button to create in active group

Fixes #131156
This commit is contained in:
Daniel Imms
2021-08-20 08:54:16 -07:00
parent a24bd09b0b
commit c8612458cb
4 changed files with 17 additions and 9 deletions
@@ -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();
}
});
@@ -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;
}
@@ -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,
@@ -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;