diff --git a/src/vs/workbench/contrib/terminal/browser/terminalView.ts b/src/vs/workbench/contrib/terminal/browser/terminalView.ts index 827016295cd..e13c1719613 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalView.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalView.ts @@ -35,7 +35,7 @@ import { renderLabelWithIcons } from '../../../../base/browser/ui/iconLabel/icon import { getColorForSeverity } from './terminalStatusList.js'; import { getFlatContextMenuActions, MenuEntryActionViewItem } from '../../../../platform/actions/browser/menuEntryActionViewItem.js'; import { DropdownWithPrimaryActionViewItem } from '../../../../platform/actions/browser/dropdownWithPrimaryActionViewItem.js'; -import { DisposableStore, dispose, IDisposable, MutableDisposable, toDisposable } from '../../../../base/common/lifecycle.js'; +import { DisposableMap, DisposableStore, dispose, IDisposable, MutableDisposable, toDisposable } from '../../../../base/common/lifecycle.js'; import { URI } from '../../../../base/common/uri.js'; import { ColorScheme } from '../../../../platform/theme/common/theme.js'; import { getColorClass, getUriClasses } from './terminalIcon.js'; @@ -67,6 +67,7 @@ export class TerminalViewPane extends ViewPane { private readonly _singleTabMenu: IMenu; private _viewShowing: IContextKey; private readonly _disposableStore = this._register(new DisposableStore()); + private readonly _actionDisposables: DisposableMap = this._register(new DisposableMap()); constructor( options: IViewPaneOptions, @@ -251,12 +252,12 @@ export class TerminalViewPane extends ViewPane { } override createActionViewItem(action: Action, options: IBaseActionViewItemOptions): IActionViewItem | undefined { - this._disposableStore.clear(); switch (action.id) { case TerminalCommandId.Split: { // Split needs to be special cased to force splitting within the panel, not the editor const that = this; - const panelOnlySplitAction = new class extends Action { + const store = new DisposableStore(); + const panelOnlySplitAction = store.add(new class extends Action { constructor() { super(action.id, action.label, action.class, action.enabled); this.checked = action.checked; @@ -270,17 +271,22 @@ export class TerminalViewPane extends ViewPane { } return; } - }; - this._disposableStore.add(panelOnlySplitAction); - return this._disposableStore.add(new ActionViewItem(action, panelOnlySplitAction, { ...options, icon: true, label: false, keybinding: this._getKeybindingLabel(action) })); + }); + const item = store.add(new ActionViewItem(action, panelOnlySplitAction, { ...options, icon: true, label: false, keybinding: this._getKeybindingLabel(action) })); + this._actionDisposables.set(action.id, store); + return item; } case TerminalCommandId.SwitchTerminal: { - return this._disposableStore.add(this._instantiationService.createInstance(SwitchTerminalActionViewItem, action)); + const item = this._instantiationService.createInstance(SwitchTerminalActionViewItem, action); + this._actionDisposables.set(action.id, item); + return item; } case TerminalCommandId.Focus: { if (action instanceof MenuItemAction) { const actions = getFlatContextMenuActions(this._singleTabMenu.getActions({ shouldForwardArgs: true })); - return this._instantiationService.createInstance(SingleTerminalTabActionViewItem, action, actions); + const item = this._instantiationService.createInstance(SingleTerminalTabActionViewItem, action, actions); + this._actionDisposables.set(action.id, item); + return item; } break; }