From 11d693fddfc448dbc70051b666c02d86384b6ace Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Tue, 27 Jul 2021 09:11:18 -0700 Subject: [PATCH] Dispose newWithProfile before registering again Fixes #129514 --- .../terminal/browser/terminalActions.ts | 111 ++---------------- 1 file changed, 7 insertions(+), 104 deletions(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts index 1352aeb76e2..6a2d032dd38 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalActions.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalActions.ts @@ -9,6 +9,7 @@ import { Codicon } from 'vs/base/common/codicons'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; import { Schemas } from 'vs/base/common/network'; import { isLinux, isWindows } from 'vs/base/common/platform'; +import { IDisposable } from 'vs/base/common/lifecycle'; import { withNullAsUndefined } from 'vs/base/common/types'; import { URI } from 'vs/base/common/uri'; import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService'; @@ -131,109 +132,8 @@ export function registerTerminalActions() { } }); - registerAction2(class extends Action2 { - constructor() { - super({ - id: TerminalCommandId.NewWithProfile, - title: { value: localize('workbench.action.terminal.newWithProfile', "Create New Integrated Terminal (With Profile)"), original: 'Create New Integrated Terminal (With Profile)' }, - f1: true, - category, - precondition: TerminalContextKeys.processSupported, - description: { - description: 'workbench.action.terminal.newWithProfile', - args: [{ - name: 'args', - schema: { - type: 'object', - required: ['profileName'], - properties: { - profileName: { - description: localize('workbench.action.terminal.newWithProfile.profileName', "The name of the profile to create"), - type: 'string', - minLength: 1 - } - } - } - }] - }, - }); - } - async run(accessor: ServicesAccessor, eventOrOptionsOrProfile: MouseEvent | ICreateTerminalOptions | ITerminalProfile | { profileName: string } | undefined, profile?: ITerminalProfile) { - const terminalService = accessor.get(ITerminalService); - const terminalGroupService = accessor.get(ITerminalGroupService); - const workspaceContextService = accessor.get(IWorkspaceContextService); - const commandService = accessor.get(ICommandService); - - let event: MouseEvent | PointerEvent | KeyboardEvent | undefined; - let options: ICreateTerminalOptions | undefined; - if (typeof eventOrOptionsOrProfile === 'object' && eventOrOptionsOrProfile && ('profileName' in eventOrOptionsOrProfile || 'title' in eventOrOptionsOrProfile)) { - const config = terminalService.allProfiles?.find(profile => { - if (profile) { - if ('title' in profile) { - return profile.title === eventOrOptionsOrProfile.profileName; - } else if ('profileName' in profile) { - return profile.profileName === eventOrOptionsOrProfile.profileName; - } else { - return false; - } - } - return false; - }); - if (!config) { - throw new Error(`Could not find terminal profile "${eventOrOptionsOrProfile.profileName}"`); - } - options = { config }; - } else if (eventOrOptionsOrProfile instanceof MouseEvent || eventOrOptionsOrProfile instanceof PointerEvent || eventOrOptionsOrProfile instanceof KeyboardEvent) { - event = eventOrOptionsOrProfile; - options = profile ? { config: profile } : undefined; - } else { - options = convertOptionsOrProfileToOptions(eventOrOptionsOrProfile); - } - - const folders = workspaceContextService.getWorkspace().folders; - if (event && (event.altKey || event.ctrlKey)) { - const activeInstance = terminalService.activeInstance; - if (activeInstance) { - const cwd = await getCwdForSplit(terminalService.configHelper, activeInstance); - await terminalService.splitInstance(activeInstance, options?.config, cwd); - return; - } - } - - if (terminalService.isProcessSupportRegistered) { - let instance: ITerminalInstance | undefined; - let cwd: string | URI | undefined; - if (folders.length > 1) { - // multi-root workspace, create root picker - const options: IPickOptions = { - placeHolder: localize('workbench.action.terminal.newWorkspacePlaceholder', "Select current working directory for new terminal") - }; - const workspace = await commandService.executeCommand(PICK_WORKSPACE_FOLDER_COMMAND_ID, [options]); - if (!workspace) { - // Don't create the instance if the workspace picker was canceled - return; - } - cwd = workspace.uri; - } - - if (options) { - instance = await terminalService.createTerminal(options); - } else { - instance = await terminalService.showProfileQuickPick('createInstance', cwd); - } - - if (instance) { - terminalService.setActiveInstance(instance); - if (instance.target === TerminalLocation.Editor) { - await instance.focusWhenReady(true); - } else { - await terminalGroupService.showPanel(true); - } - } - - } - } - }); + // Register new with profile command + refreshTerminalActions([]); registerAction2(class extends Action2 { constructor() { @@ -2069,10 +1969,13 @@ function convertOptionsOrProfileToOptions(optionsOrProfile?: ICreateTerminalOpti return optionsOrProfile; } +let newWithProfileAction: IDisposable; + export function refreshTerminalActions(detectedProfiles: ITerminalProfile[]) { const profileEnum = createProfileSchemaEnums(detectedProfiles); const category: ILocalizedString = { value: TERMINAL_ACTION_CATEGORY, original: 'Terminal' }; - registerAction2(class extends Action2 { + newWithProfileAction?.dispose(); + newWithProfileAction = registerAction2(class extends Action2 { constructor() { super({ id: TerminalCommandId.NewWithProfile,