diff --git a/src/vs/workbench/contrib/terminal/browser/terminalIcon.ts b/src/vs/workbench/contrib/terminal/browser/terminalIcon.ts index ff25f7882b4..b098cc3ece1 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalIcon.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalIcon.ts @@ -3,10 +3,11 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Codicon, iconRegistry } from 'vs/base/common/codicons'; +import { Codicon } from 'vs/base/common/codicons'; import { hash } from 'vs/base/common/hash'; import { URI } from 'vs/base/common/uri'; import { IExtensionTerminalProfile, ITerminalProfile } from 'vs/platform/terminal/common/terminal'; +import { getIconRegistry } from 'vs/platform/theme/common/iconRegistry'; import { ColorScheme } from 'vs/platform/theme/common/theme'; import { IColorTheme, ThemeIcon } from 'vs/platform/theme/common/themeService'; import { ITerminalInstance } from 'vs/workbench/contrib/terminal/browser/terminal'; @@ -94,7 +95,7 @@ export function getUriClasses(terminal: ITerminalInstance | IExtensionTerminalPr let uri = undefined; if (extensionContributed) { - if (typeof icon === 'string' && (icon.startsWith('$(') || iconRegistry.get(icon))) { + if (typeof icon === 'string' && (icon.startsWith('$(') || getIconRegistry().getIcon(icon))) { return iconClasses; } else if (typeof icon === 'string') { uri = URI.parse(icon); diff --git a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts index 407f1fe26a0..94547d7ee3b 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalInstance.ts @@ -1798,15 +1798,16 @@ export class TerminalInstance extends Disposable implements ITerminalInstance { } async changeIcon() { - const items: IQuickPickItem[] = []; + type Item = IQuickPickItem & { icon: TerminalIcon }; + const items: Item[] = []; for (const icon of iconRegistry.all) { - items.push({ label: `$(${icon.id})`, description: `${icon.id}` }); + items.push({ label: `$(${icon.id})`, description: `${icon.id}`, icon }); } const result = await this._quickInputService.pick(items, { matchOnDescription: true }); - if (result && result.description) { - this._icon = iconRegistry.get(result.description); + if (result) { + this._icon = result.icon; this._onIconChanged.fire(this); } } diff --git a/src/vs/workbench/contrib/terminal/browser/terminalProfileQuickpick.ts b/src/vs/workbench/contrib/terminal/browser/terminalProfileQuickpick.ts index 1f2efc11842..04abfd38d35 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalProfileQuickpick.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalProfileQuickpick.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { iconRegistry, Codicon } from 'vs/base/common/codicons'; +import { Codicon } from 'vs/base/common/codicons'; import { ConfigurationTarget, IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IQuickInputService, IKeyMods, IPickOptions, IQuickPickSeparator, IQuickInputButton, IQuickPickItem } from 'vs/platform/quickinput/common/quickInput'; import { IExtensionTerminalProfile, ITerminalProfile, ITerminalProfileObject, TerminalSettingPrefix } from 'vs/platform/terminal/common/terminal'; @@ -14,6 +14,7 @@ import { IThemeService, ThemeIcon } from 'vs/platform/theme/common/themeService' import { ITerminalProfileService } from 'vs/workbench/contrib/terminal/common/terminal'; import { IQuickPickTerminalObject, ITerminalInstance } from 'vs/workbench/contrib/terminal/browser/terminal'; import { IPickerQuickAccessItem } from 'vs/platform/quickinput/browser/pickerQuickAccess'; +import { getIconRegistry } from 'vs/platform/theme/common/iconRegistry'; type DefaultProfileName = string; @@ -144,10 +145,17 @@ export class TerminalProfileQuickpick { quickPickItems.push({ type: 'separator', label: nls.localize('ICreateContributedTerminalProfileOptions', "contributed") }); const contributedProfiles: IProfileQuickPickItem[] = []; for (const contributed of this._terminalProfileService.contributedProfiles) { - if (typeof contributed.icon === 'string' && contributed.icon.startsWith('$(')) { - contributed.icon = contributed.icon.substring(2, contributed.icon.length - 1); + let icon: ThemeIcon | undefined; + if (typeof contributed.icon === 'string') { + if (contributed.icon.startsWith('$(')) { + icon = ThemeIcon.fromString(contributed.icon); + } else { + icon = ThemeIcon.fromId(contributed.icon); + } + } + if (!icon || !getIconRegistry().getIcon(icon.id)) { + icon = Codicon.terminal; } - const icon = contributed.icon && typeof contributed.icon === 'string' ? (iconRegistry.get(contributed.icon) || Codicon.terminal) : Codicon.terminal; const uriClasses = getUriClasses(contributed, this._themeService.getColorTheme().type, true); const colorClass = getColorClass(contributed); const iconClasses = []; diff --git a/src/vs/workbench/contrib/terminal/browser/terminalProfileResolverService.ts b/src/vs/workbench/contrib/terminal/browser/terminalProfileResolverService.ts index fbb98f86b9d..c7ce30438a4 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalProfileResolverService.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalProfileResolverService.ts @@ -15,7 +15,7 @@ import { IProcessEnvironment, OperatingSystem, OS } from 'vs/base/common/platfor import { IShellLaunchConfig, ITerminalProfile, ITerminalProfileObject, TerminalIcon, TerminalSettingId, TerminalSettingPrefix } from 'vs/platform/terminal/common/terminal'; import { IShellLaunchConfigResolveOptions, ITerminalProfileResolverService, ITerminalProfileService } from 'vs/workbench/contrib/terminal/common/terminal'; import * as path from 'vs/base/common/path'; -import { Codicon, iconRegistry } from 'vs/base/common/codicons'; +import { Codicon } from 'vs/base/common/codicons'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; import { debounce } from 'vs/base/common/decorators'; import { ThemeIcon } from 'vs/platform/theme/common/themeService'; @@ -172,7 +172,7 @@ export abstract class BaseTerminalProfileResolverService implements ITerminalPro return undefined; } if (typeof icon === 'string') { - return iconRegistry.get(icon); + return ThemeIcon.fromId(icon); } if (ThemeIcon.isThemeIcon(icon)) { return icon; diff --git a/src/vs/workbench/contrib/terminal/browser/terminalService.ts b/src/vs/workbench/contrib/terminal/browser/terminalService.ts index 9610f47fd53..552c8fa1efa 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalService.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalService.ts @@ -5,7 +5,6 @@ import * as dom from 'vs/base/browser/dom'; import { timeout } from 'vs/base/common/async'; -import { Codicon, iconRegistry } from 'vs/base/common/codicons'; import { debounce } from 'vs/base/common/decorators'; import { Emitter, Event } from 'vs/base/common/event'; import { dispose, IDisposable, toDisposable } from 'vs/base/common/lifecycle'; @@ -20,7 +19,7 @@ import { IInstantiationService } from 'vs/platform/instantiation/common/instanti import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { ICreateContributedTerminalProfileOptions, IShellLaunchConfig, ITerminalLaunchError, ITerminalsLayoutInfo, ITerminalsLayoutInfoById, TerminalLocation, TerminalLocationString } from 'vs/platform/terminal/common/terminal'; import { iconForeground } from 'vs/platform/theme/common/colorRegistry'; -import { IconDefinition } from 'vs/platform/theme/common/iconRegistry'; +import { getIconRegistry, IconContribution } from 'vs/platform/theme/common/iconRegistry'; import { ColorScheme } from 'vs/platform/theme/common/theme'; import { IThemeService, Themable, ThemeIcon } from 'vs/platform/theme/common/themeService'; import { VirtualWorkspaceContext } from 'vs/workbench/browser/contextkeys'; @@ -1126,16 +1125,16 @@ class TerminalEditorStyle extends Themable { ); } if (ThemeIcon.isThemeIcon(icon)) { - const codicon = iconRegistry.get(icon.id); - if (codicon) { - let def: Codicon | IconDefinition = codicon; - while ('definition' in def) { - def = def.definition; + const iconRegistry = getIconRegistry(); + const iconContribution = iconRegistry.getIcon(icon.id); + if (iconContribution) { + const def = IconContribution.getDefinition(iconContribution, iconRegistry); + if (def) { + css += ( + `.monaco-workbench .terminal-tab.codicon-${icon.id}::before` + + `{content: '${def.fontCharacter}' !important; font-family: ${dom.asCSSPropertyValue(def.fontId ?? 'codicon')} !important;}` + ); } - css += ( - `.monaco-workbench .terminal-tab.codicon-${icon.id}::before` + - `{content: '${def.fontCharacter}' !important;}` - ); } } }