From 101946e45e54d4105de00f02a0aaa36b095427c9 Mon Sep 17 00:00:00 2001 From: Alex Ross <38270282+alexr00@users.noreply.github.com> Date: Thu, 20 Feb 2025 11:04:31 +0100 Subject: [PATCH] Respond to theme updates for tree sitter --- .../editor/common/viewModel/viewModelImpl.ts | 4 +-- .../colorPickerParts/colorPickerHeader.ts | 4 +-- .../gotoError/browser/gotoErrorWidget.ts | 8 +++-- .../browser/peek/referencesWidget.ts | 8 +++-- .../contrib/rename/browser/renameWidget.ts | 2 +- .../contrib/suggest/browser/suggestWidget.ts | 2 +- .../browser/standaloneThemeService.ts | 6 ++-- .../test/browser/standaloneLanguages.test.ts | 4 +-- src/vs/platform/theme/common/themeService.ts | 6 ++-- .../theme/test/common/testThemeService.ts | 8 ++--- .../browser/parts/compositeBarActions.ts | 4 +-- .../browser/parts/statusbar/statusbarItem.ts | 4 +-- .../browser/callHierarchyPeek.ts | 2 +- .../browser/commentThreadZoneWidget.ts | 2 +- .../contrib/debug/browser/disassemblyView.ts | 4 +-- .../contrib/debug/browser/exceptionWidget.ts | 8 +++-- .../browser/diff/notebookDiffOverviewRuler.ts | 2 +- .../contrib/scm/browser/quickDiffWidget.ts | 2 +- .../terminal/browser/xterm/xtermTerminal.ts | 2 +- .../browser/typeHierarchyPeek.ts | 2 +- .../themes/browser/workbenchThemeService.ts | 14 ++++----- .../themes/common/workbenchThemeService.ts | 8 +++-- .../browser/treeSitterCodeEditors.ts | 4 +++ .../browser/treeSitterTokenizationFeature.ts | 29 ++++++++++++++++--- 24 files changed, 90 insertions(+), 49 deletions(-) diff --git a/src/vs/editor/common/viewModel/viewModelImpl.ts b/src/vs/editor/common/viewModel/viewModelImpl.ts index 96043722d84c5..1db5908509026 100644 --- a/src/vs/editor/common/viewModel/viewModelImpl.ts +++ b/src/vs/editor/common/viewModel/viewModelImpl.ts @@ -153,9 +153,9 @@ export class ViewModel extends Disposable implements IViewModel { this._eventDispatcher.emitSingleViewEvent(new viewEvents.ViewTokensColorsChangedEvent()); })); - this._register(this._themeService.onDidColorThemeChange((theme) => { + this._register(this._themeService.onDidColorThemeChange((e) => { this._invalidateDecorationsColorCache(); - this._eventDispatcher.emitSingleViewEvent(new viewEvents.ViewThemeChangedEvent(theme)); + this._eventDispatcher.emitSingleViewEvent(new viewEvents.ViewThemeChangedEvent(e.theme)); })); this._updateConfigurationViewLineCountNow(); diff --git a/src/vs/editor/contrib/colorPicker/browser/colorPickerParts/colorPickerHeader.ts b/src/vs/editor/contrib/colorPicker/browser/colorPickerParts/colorPickerHeader.ts index 8522f41e361e9..8d11bdf3ac76f 100644 --- a/src/vs/editor/contrib/colorPicker/browser/colorPickerParts/colorPickerHeader.ts +++ b/src/vs/editor/contrib/colorPicker/browser/colorPickerParts/colorPickerHeader.ts @@ -43,8 +43,8 @@ export class ColorPickerHeader extends Disposable { this._originalColorNode.style.backgroundColor = Color.Format.CSS.format(this.model.originalColor) || ''; this.backgroundColor = themeService.getColorTheme().getColor(editorHoverBackground) || Color.white; - this._register(themeService.onDidColorThemeChange(theme => { - this.backgroundColor = theme.getColor(editorHoverBackground) || Color.white; + this._register(themeService.onDidColorThemeChange(e => { + this.backgroundColor = e.theme.getColor(editorHoverBackground) || Color.white; })); this._register(dom.addDisposableListener(this._pickedColorNode, dom.EventType.CLICK, () => this.model.selectNextColorPresentation())); diff --git a/src/vs/editor/contrib/gotoError/browser/gotoErrorWidget.ts b/src/vs/editor/contrib/gotoError/browser/gotoErrorWidget.ts index 5a8bc4fb7ed7f..33c8ce333233b 100644 --- a/src/vs/editor/contrib/gotoError/browser/gotoErrorWidget.ts +++ b/src/vs/editor/contrib/gotoError/browser/gotoErrorWidget.ts @@ -28,7 +28,7 @@ import { IMarker, IRelatedInformation, MarkerSeverity } from '../../../../platfo import { IOpenerService } from '../../../../platform/opener/common/opener.js'; import { SeverityIcon } from '../../../../platform/severityIcon/browser/severityIcon.js'; import { contrastBorder, editorBackground, editorErrorBorder, editorErrorForeground, editorInfoBorder, editorInfoForeground, editorWarningBorder, editorWarningForeground, oneOf, registerColor, transparent } from '../../../../platform/theme/common/colorRegistry.js'; -import { IColorTheme, IThemeService } from '../../../../platform/theme/common/themeService.js'; +import { IColorTheme, IThemeChangeEvent, IThemeService } from '../../../../platform/theme/common/themeService.js'; class MessageWidget { @@ -255,11 +255,15 @@ export class MarkerNavigationWidget extends PeekViewWidget { this._backgroundColor = Color.white; this._applyTheme(_themeService.getColorTheme()); - this._callOnDispose.add(_themeService.onDidColorThemeChange(this._applyTheme.bind(this))); + this._callOnDispose.add(_themeService.onDidColorThemeChange(this._ondDidColorThemeChange.bind(this))); this.create(); } + private _ondDidColorThemeChange(e: IThemeChangeEvent) { + this._applyTheme(e.theme); + } + private _applyTheme(theme: IColorTheme) { this._backgroundColor = theme.getColor(editorMarkerNavigationBackground); let colorId = editorMarkerNavigationError; diff --git a/src/vs/editor/contrib/gotoSymbol/browser/peek/referencesWidget.ts b/src/vs/editor/contrib/gotoSymbol/browser/peek/referencesWidget.ts index 9581b5cf6ff6b..6c7da6476db16 100644 --- a/src/vs/editor/contrib/gotoSymbol/browser/peek/referencesWidget.ts +++ b/src/vs/editor/contrib/gotoSymbol/browser/peek/referencesWidget.ts @@ -32,7 +32,7 @@ import { IInstantiationService } from '../../../../../platform/instantiation/com import { IKeybindingService } from '../../../../../platform/keybinding/common/keybinding.js'; import { ILabelService } from '../../../../../platform/label/common/label.js'; import { IWorkbenchAsyncDataTreeOptions, WorkbenchAsyncDataTree } from '../../../../../platform/list/browser/listService.js'; -import { IColorTheme, IThemeService } from '../../../../../platform/theme/common/themeService.js'; +import { IColorTheme, IThemeChangeEvent, IThemeService } from '../../../../../platform/theme/common/themeService.js'; import { FileReferences, OneReference, ReferencesModel } from '../referencesModel.js'; import { ITreeDragAndDrop, ITreeDragOverReaction } from '../../../../../base/browser/ui/tree/tree.js'; import { DataTransfers, IDragAndDropData } from '../../../../../base/browser/dnd.js'; @@ -276,7 +276,7 @@ export class ReferenceWidget extends peekView.PeekViewWidget { super(editor, { showFrame: false, showArrow: true, isResizeable: true, isAccessible: true, supportOnTitleClick: true }, _instantiationService); this._applyTheme(themeService.getColorTheme()); - this._callOnDispose.add(themeService.onDidColorThemeChange(this._applyTheme.bind(this))); + this._callOnDispose.add(themeService.onDidColorThemeChange(this._onDidColorThemeChange.bind(this))); this._peekViewService.addExclusiveWidget(editor, this); this.create(); } @@ -298,6 +298,10 @@ export class ReferenceWidget extends peekView.PeekViewWidget { super.dispose(); } + private _onDidColorThemeChange(e: IThemeChangeEvent): void { + this._applyTheme(e.theme); + } + private _applyTheme(theme: IColorTheme) { const borderColor = theme.getColor(peekView.peekViewBorder) || Color.transparent; this.style({ diff --git a/src/vs/editor/contrib/rename/browser/renameWidget.ts b/src/vs/editor/contrib/rename/browser/renameWidget.ts index e5a7bc7149750..baf0f0b88c495 100644 --- a/src/vs/editor/contrib/rename/browser/renameWidget.ts +++ b/src/vs/editor/contrib/rename/browser/renameWidget.ts @@ -181,7 +181,7 @@ export class RenameWidget implements IRenameWidget, IContentWidget, IDisposable } })); - this._disposables.add(_themeService.onDidColorThemeChange(this._updateStyles, this)); + this._disposables.add(_themeService.onDidColorThemeChange(e => this._updateStyles(e.theme))); } dispose(): void { diff --git a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts index 0ad604159e1ae..fbaa5530d8939 100644 --- a/src/vs/editor/contrib/suggest/browser/suggestWidget.ts +++ b/src/vs/editor/contrib/suggest/browser/suggestWidget.ts @@ -270,7 +270,7 @@ export class SuggestWidget implements IDisposable { const applyStatusBarStyle = () => this.element.domNode.classList.toggle('with-status-bar', this.editor.getOption(EditorOption.suggest).showStatusBar); applyStatusBarStyle(); - this._disposables.add(_themeService.onDidColorThemeChange(t => this._onThemeChange(t))); + this._disposables.add(_themeService.onDidColorThemeChange(t => this._onThemeChange(t.theme))); this._onThemeChange(_themeService.getColorTheme()); this._disposables.add(this._list.onMouseDown(e => this._onListMouseDownOrTap(e))); diff --git a/src/vs/editor/standalone/browser/standaloneThemeService.ts b/src/vs/editor/standalone/browser/standaloneThemeService.ts index 8a697f653ff58..4446b69329066 100644 --- a/src/vs/editor/standalone/browser/standaloneThemeService.ts +++ b/src/vs/editor/standalone/browser/standaloneThemeService.ts @@ -16,7 +16,7 @@ import { hc_black, hc_light, vs, vs_dark } from '../common/themes.js'; import { IEnvironmentService } from '../../../platform/environment/common/environment.js'; import { Registry } from '../../../platform/registry/common/platform.js'; import { asCssVariableName, ColorIdentifier, Extensions, IColorRegistry } from '../../../platform/theme/common/colorRegistry.js'; -import { Extensions as ThemingExtensions, ICssStyleCollector, IFileIconTheme, IProductIconTheme, IThemingRegistry, ITokenStyle } from '../../../platform/theme/common/themeService.js'; +import { Extensions as ThemingExtensions, ICssStyleCollector, IFileIconTheme, IProductIconTheme, IThemingRegistry, ITokenStyle, IThemeChangeEvent } from '../../../platform/theme/common/themeService.js'; import { IDisposable, Disposable } from '../../../base/common/lifecycle.js'; import { ColorScheme, isDark, isHighContrast } from '../../../platform/theme/common/theme.js'; import { getIconsStyleSheet, UnthemedProductIconTheme } from '../../../platform/theme/browser/iconsStyleSheet.js'; @@ -213,7 +213,7 @@ export class StandaloneThemeService extends Disposable implements IStandaloneThe declare readonly _serviceBrand: undefined; - private readonly _onColorThemeChange = this._register(new Emitter()); + private readonly _onColorThemeChange = this._register(new Emitter()); public readonly onDidColorThemeChange = this._onColorThemeChange.event; private readonly _onFileIconThemeChange = this._register(new Emitter()); @@ -403,7 +403,7 @@ export class StandaloneThemeService extends Disposable implements IStandaloneThe this._updateCSS(); TokenizationRegistry.setColorMap(colorMap); - this._onColorThemeChange.fire(this._theme); + this._onColorThemeChange.fire({ theme: this._theme }); } private _updateCSS(): void { diff --git a/src/vs/editor/standalone/test/browser/standaloneLanguages.test.ts b/src/vs/editor/standalone/test/browser/standaloneLanguages.test.ts index 0fa82cf782b20..def6b624a1895 100644 --- a/src/vs/editor/standalone/test/browser/standaloneLanguages.test.ts +++ b/src/vs/editor/standalone/test/browser/standaloneLanguages.test.ts @@ -17,7 +17,7 @@ import { IStandaloneTheme, IStandaloneThemeData, IStandaloneThemeService } from import { UnthemedProductIconTheme } from '../../../../platform/theme/browser/iconsStyleSheet.js'; import { ColorIdentifier } from '../../../../platform/theme/common/colorRegistry.js'; import { ColorScheme } from '../../../../platform/theme/common/theme.js'; -import { IColorTheme, IFileIconTheme, IProductIconTheme, ITokenStyle } from '../../../../platform/theme/common/themeService.js'; +import { IFileIconTheme, IProductIconTheme, IThemeChangeEvent, ITokenStyle } from '../../../../platform/theme/common/themeService.js'; suite('TokenizationSupport2Adapter', () => { @@ -92,7 +92,7 @@ suite('TokenizationSupport2Adapter', () => { public getProductIconTheme(): IProductIconTheme { return this._builtInProductIconTheme; } - public readonly onDidColorThemeChange = new Emitter().event; + public readonly onDidColorThemeChange = new Emitter().event; public readonly onDidFileIconThemeChange = new Emitter().event; public readonly onDidProductIconThemeChange = new Emitter().event; } diff --git a/src/vs/platform/theme/common/themeService.ts b/src/vs/platform/theme/common/themeService.ts index 7911e0221da90..1f54a38197a5f 100644 --- a/src/vs/platform/theme/common/themeService.ts +++ b/src/vs/platform/theme/common/themeService.ts @@ -100,12 +100,14 @@ export interface IThemingParticipant { (theme: IColorTheme, collector: ICssStyleCollector, environment: IEnvironmentService): void; } +export type IThemeChangeEvent = { theme: IColorTheme }; + export interface IThemeService { readonly _serviceBrand: undefined; getColorTheme(): IColorTheme; - readonly onDidColorThemeChange: Event; + readonly onDidColorThemeChange: Event; getFileIconTheme(): IFileIconTheme; @@ -182,7 +184,7 @@ export class Themable extends Disposable { this.theme = themeService.getColorTheme(); // Hook up to theme changes - this._register(this.themeService.onDidColorThemeChange(theme => this.onThemeChange(theme))); + this._register(this.themeService.onDidColorThemeChange(e => this.onThemeChange(e.theme))); } protected onThemeChange(theme: IColorTheme): void { diff --git a/src/vs/platform/theme/test/common/testThemeService.ts b/src/vs/platform/theme/test/common/testThemeService.ts index 8ee388d4dbd3e..0e6c72cadcc08 100644 --- a/src/vs/platform/theme/test/common/testThemeService.ts +++ b/src/vs/platform/theme/test/common/testThemeService.ts @@ -7,7 +7,7 @@ import { Color } from '../../../../base/common/color.js'; import { Emitter, Event } from '../../../../base/common/event.js'; import { IconContribution } from '../../common/iconRegistry.js'; import { ColorScheme } from '../../common/theme.js'; -import { IColorTheme, IFileIconTheme, IProductIconTheme, IThemeService, ITokenStyle } from '../../common/themeService.js'; +import { IColorTheme, IFileIconTheme, IProductIconTheme, IThemeChangeEvent, IThemeService, ITokenStyle } from '../../common/themeService.js'; export class TestColorTheme implements IColorTheme { @@ -58,7 +58,7 @@ export class TestThemeService implements IThemeService { _colorTheme: IColorTheme; _fileIconTheme: IFileIconTheme; _productIconTheme: IProductIconTheme; - _onThemeChange = new Emitter(); + _onThemeChange = new Emitter(); _onFileIconThemeChange = new Emitter(); _onProductIconThemeChange = new Emitter(); @@ -78,10 +78,10 @@ export class TestThemeService implements IThemeService { } fireThemeChange() { - this._onThemeChange.fire(this._colorTheme); + this._onThemeChange.fire({ theme: this._colorTheme }); } - public get onDidColorThemeChange(): Event { + public get onDidColorThemeChange(): Event { return this._onThemeChange.event; } diff --git a/src/vs/workbench/browser/parts/compositeBarActions.ts b/src/vs/workbench/browser/parts/compositeBarActions.ts index 136b41c9800cc..5a792fe9a3a07 100644 --- a/src/vs/workbench/browser/parts/compositeBarActions.ts +++ b/src/vs/workbench/browser/parts/compositeBarActions.ts @@ -9,7 +9,7 @@ import { $, addDisposableListener, append, clearNode, EventHelper, EventType, ge import { ICommandService } from '../../../platform/commands/common/commands.js'; import { toDisposable, DisposableStore, MutableDisposable } from '../../../base/common/lifecycle.js'; import { IContextMenuService } from '../../../platform/contextview/browser/contextView.js'; -import { IThemeService, IColorTheme } from '../../../platform/theme/common/themeService.js'; +import { IThemeService, IColorTheme, IThemeChangeEvent } from '../../../platform/theme/common/themeService.js'; import { NumberBadge, IBadge, IActivity, ProgressBadge, IconBadge } from '../../services/activity/common/activity.js'; import { IInstantiationService, ServicesAccessor } from '../../../platform/instantiation/common/instantiation.js'; import { DelayedDragHandler } from '../../../base/browser/dnd.js'; @@ -289,7 +289,7 @@ export class CompositeBarActionViewItem extends BaseActionViewItem { this.updateTitle(); } - private onThemeChange(theme: IColorTheme): void { + private onThemeChange(theme: IThemeChangeEvent): void { this.updateStyles(); } diff --git a/src/vs/workbench/browser/parts/statusbar/statusbarItem.ts b/src/vs/workbench/browser/parts/statusbar/statusbarItem.ts index 149ee4cbff52b..198e34c731b84 100644 --- a/src/vs/workbench/browser/parts/statusbar/statusbarItem.ts +++ b/src/vs/workbench/browser/parts/statusbar/statusbarItem.ts @@ -253,8 +253,8 @@ export class StatusbarEntryItem extends Disposable { if (isThemeColor(color)) { colorResult = this.themeService.getColorTheme().getColor(color.id)?.toString(); - const listener = this.themeService.onDidColorThemeChange(theme => { - const colorValue = theme.getColor(color.id)?.toString(); + const listener = this.themeService.onDidColorThemeChange(e => { + const colorValue = e.theme.getColor(color.id)?.toString(); if (isBackground) { container.style.backgroundColor = colorValue ?? ''; diff --git a/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyPeek.ts b/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyPeek.ts index 75da6466a36d1..0afedce845a52 100644 --- a/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyPeek.ts +++ b/src/vs/workbench/contrib/callHierarchy/browser/callHierarchyPeek.ts @@ -96,7 +96,7 @@ export class CallHierarchyTreePeekWidget extends peekView.PeekViewWidget { this.create(); this._peekViewService.addExclusiveWidget(editor, this); this._applyTheme(themeService.getColorTheme()); - this._disposables.add(themeService.onDidColorThemeChange(this._applyTheme, this)); + this._disposables.add(themeService.onDidColorThemeChange(e => this._applyTheme(e.theme))); this._disposables.add(this._previewDisposable); } diff --git a/src/vs/workbench/contrib/comments/browser/commentThreadZoneWidget.ts b/src/vs/workbench/contrib/comments/browser/commentThreadZoneWidget.ts index 0039a4030eaa7..e664efbc245d4 100644 --- a/src/vs/workbench/contrib/comments/browser/commentThreadZoneWidget.ts +++ b/src/vs/workbench/contrib/comments/browser/commentThreadZoneWidget.ts @@ -157,7 +157,7 @@ export class ReviewZoneWidget extends ZoneWidget implements ICommentThreadWidget this._commentThreadDisposables = []; this.create(); - this._globalToDispose.add(this.themeService.onDidColorThemeChange(this._applyTheme, this)); + this._globalToDispose.add(this.themeService.onDidColorThemeChange(e => this._applyTheme(e.theme))); this._globalToDispose.add(this.editor.onDidChangeConfiguration(e => { if (e.hasChanged(EditorOption.fontInfo)) { this._applyTheme(this.themeService.getColorTheme()); diff --git a/src/vs/workbench/contrib/debug/browser/disassemblyView.ts b/src/vs/workbench/contrib/debug/browser/disassemblyView.ts index c98e35153df96..95c740dcaa6a5 100644 --- a/src/vs/workbench/contrib/debug/browser/disassemblyView.ts +++ b/src/vs/workbench/contrib/debug/browser/disassemblyView.ts @@ -775,8 +775,8 @@ class InstructionRenderer extends Disposable implements ITableRenderer { - this._topStackFrameColor = e.getColor(topStackFrameColor); - this._focusedStackFrameColor = e.getColor(focusedStackFrameColor); + this._topStackFrameColor = e.theme.getColor(topStackFrameColor); + this._focusedStackFrameColor = e.theme.getColor(focusedStackFrameColor); })); } diff --git a/src/vs/workbench/contrib/debug/browser/exceptionWidget.ts b/src/vs/workbench/contrib/debug/browser/exceptionWidget.ts index 35479f2cef735..9f8d26570ede6 100644 --- a/src/vs/workbench/contrib/debug/browser/exceptionWidget.ts +++ b/src/vs/workbench/contrib/debug/browser/exceptionWidget.ts @@ -10,7 +10,7 @@ import { ZoneWidget } from '../../../../editor/contrib/zoneWidget/browser/zoneWi import { ICodeEditor } from '../../../../editor/browser/editorBrowser.js'; import { IExceptionInfo, IDebugSession, IDebugEditorContribution, EDITOR_CONTRIBUTION_ID } from '../common/debug.js'; import { RunOnceScheduler } from '../../../../base/common/async.js'; -import { IThemeService, IColorTheme } from '../../../../platform/theme/common/themeService.js'; +import { IThemeService, IColorTheme, IThemeChangeEvent } from '../../../../platform/theme/common/themeService.js'; import { ThemeIcon } from '../../../../base/common/themables.js'; import { Color } from '../../../../base/common/color.js'; import { registerColor } from '../../../../platform/theme/common/colorRegistry.js'; @@ -41,7 +41,7 @@ export class ExceptionWidget extends ZoneWidget { super(editor, { showFrame: true, showArrow: true, isAccessible: true, frameWidth: 1, className: 'exception-widget-container' }); this.applyTheme(themeService.getColorTheme()); - this._disposables.add(themeService.onDidColorThemeChange(this.applyTheme.bind(this))); + this._disposables.add(themeService.onDidColorThemeChange(this.onDidColorThemeChange.bind(this))); this.create(); const onDidLayoutChangeScheduler = new RunOnceScheduler(() => this._doLayout(undefined, undefined), 50); @@ -49,6 +49,10 @@ export class ExceptionWidget extends ZoneWidget { this._disposables.add(onDidLayoutChangeScheduler); } + private onDidColorThemeChange(e: IThemeChangeEvent): void { + this.applyTheme(e.theme); + } + private applyTheme(theme: IColorTheme): void { this.backgroundColor = theme.getColor(debugExceptionWidgetBackground); const frameColor = theme.getColor(debugExceptionWidgetBorder); diff --git a/src/vs/workbench/contrib/notebook/browser/diff/notebookDiffOverviewRuler.ts b/src/vs/workbench/contrib/notebook/browser/diff/notebookDiffOverviewRuler.ts index f24aabe73b4c6..912e770936928 100644 --- a/src/vs/workbench/contrib/notebook/browser/diff/notebookDiffOverviewRuler.ts +++ b/src/vs/workbench/contrib/notebook/browser/diff/notebookDiffOverviewRuler.ts @@ -57,7 +57,7 @@ export class NotebookDiffOverviewRuler extends Themable { })); this._register(this.themeService.onDidColorThemeChange(e => { - const colorChanged = this.applyColors(e); + const colorChanged = this.applyColors(e.theme); if (colorChanged) { this._scheduleRender(); } diff --git a/src/vs/workbench/contrib/scm/browser/quickDiffWidget.ts b/src/vs/workbench/contrib/scm/browser/quickDiffWidget.ts index fc97c0071aba2..4bee5ca2e2834 100644 --- a/src/vs/workbench/contrib/scm/browser/quickDiffWidget.ts +++ b/src/vs/workbench/contrib/scm/browser/quickDiffWidget.ts @@ -172,7 +172,7 @@ class QuickDiffWidget extends PeekViewWidget { ) { super(editor, { isResizeable: true, frameWidth: 1, keepEditorSelection: true, className: 'dirty-diff' }, instantiationService); - this._disposables.add(themeService.onDidColorThemeChange(this._applyTheme, this)); + this._disposables.add(themeService.onDidColorThemeChange(e => this._applyTheme(e.theme))); this._applyTheme(themeService.getColorTheme()); if (!Iterable.isEmpty(this.model.originalTextModels)) { diff --git a/src/vs/workbench/contrib/terminal/browser/xterm/xtermTerminal.ts b/src/vs/workbench/contrib/terminal/browser/xterm/xtermTerminal.ts index b835c0b5c524d..b1a9006bf1f4a 100644 --- a/src/vs/workbench/contrib/terminal/browser/xterm/xtermTerminal.ts +++ b/src/vs/workbench/contrib/terminal/browser/xterm/xtermTerminal.ts @@ -256,7 +256,7 @@ export class XtermTerminal extends Disposable implements IXtermTerminal, IDetach } })); - this._register(this._themeService.onDidColorThemeChange(theme => this._updateTheme(theme))); + this._register(this._themeService.onDidColorThemeChange(e => this._updateTheme(e.theme))); this._register(this._logService.onDidChangeLogLevel(e => this.raw.options.logLevel = vscodeToXtermLogLevel(e))); // Refire events diff --git a/src/vs/workbench/contrib/typeHierarchy/browser/typeHierarchyPeek.ts b/src/vs/workbench/contrib/typeHierarchy/browser/typeHierarchyPeek.ts index 0af4bb62f5157..df75f745155da 100644 --- a/src/vs/workbench/contrib/typeHierarchy/browser/typeHierarchyPeek.ts +++ b/src/vs/workbench/contrib/typeHierarchy/browser/typeHierarchyPeek.ts @@ -97,7 +97,7 @@ export class TypeHierarchyTreePeekWidget extends peekView.PeekViewWidget { this.create(); this._peekViewService.addExclusiveWidget(editor, this); this._applyTheme(themeService.getColorTheme()); - this._disposables.add(themeService.onDidColorThemeChange(this._applyTheme, this)); + this._disposables.add(themeService.onDidColorThemeChange(e => this._applyTheme(e.theme), this)); this._disposables.add(this._previewDisposable); } diff --git a/src/vs/workbench/services/themes/browser/workbenchThemeService.ts b/src/vs/workbench/services/themes/browser/workbenchThemeService.ts index baf78a990da00..f2a4f0d8dcbca 100644 --- a/src/vs/workbench/services/themes/browser/workbenchThemeService.ts +++ b/src/vs/workbench/services/themes/browser/workbenchThemeService.ts @@ -6,7 +6,7 @@ import * as nls from '../../../../nls.js'; import * as types from '../../../../base/common/types.js'; import { IExtensionService } from '../../extensions/common/extensions.js'; -import { IWorkbenchThemeService, IWorkbenchColorTheme, IWorkbenchFileIconTheme, ExtensionData, ThemeSettings, IWorkbenchProductIconTheme, ThemeSettingTarget, ThemeSettingDefaults, COLOR_THEME_DARK_INITIAL_COLORS, COLOR_THEME_LIGHT_INITIAL_COLORS } from '../common/workbenchThemeService.js'; +import { IWorkbenchThemeService, IWorkbenchColorTheme, IWorkbenchFileIconTheme, ExtensionData, ThemeSettings, IWorkbenchProductIconTheme, ThemeSettingTarget, ThemeSettingDefaults, COLOR_THEME_DARK_INITIAL_COLORS, COLOR_THEME_LIGHT_INITIAL_COLORS, IWorkbenchThemeChangeEvent } from '../common/workbenchThemeService.js'; import { IStorageService } from '../../../../platform/storage/common/storage.js'; import { ITelemetryService } from '../../../../platform/telemetry/common/telemetry.js'; import { Registry } from '../../../../platform/registry/common/platform.js'; @@ -79,7 +79,7 @@ export class WorkbenchThemeService extends Disposable implements IWorkbenchTheme private readonly colorThemeRegistry: ThemeRegistry; private currentColorTheme: ColorThemeData; - private readonly onColorThemeChange: Emitter; + private readonly onColorThemeChange: Emitter; private readonly colorThemeWatcher: ThemeFileWatcher; private colorThemingParticipantChangeListener: IDisposable | undefined; private readonly colorThemeSequencer: Sequencer; @@ -117,7 +117,7 @@ export class WorkbenchThemeService extends Disposable implements IWorkbenchTheme this.colorThemeRegistry = this._register(new ThemeRegistry(colorThemesExtPoint, ColorThemeData.fromExtensionTheme)); this.colorThemeWatcher = this._register(new ThemeFileWatcher(fileService, environmentService, this.reloadCurrentColorTheme.bind(this))); - this.onColorThemeChange = new Emitter({ leakWarningThreshold: 400 }); + this.onColorThemeChange = new Emitter({ leakWarningThreshold: 400 }); this.currentColorTheme = ColorThemeData.createUnloadedTheme(''); this.colorThemeSequencer = new Sequencer(); @@ -134,7 +134,7 @@ export class WorkbenchThemeService extends Disposable implements IWorkbenchTheme this.currentProductIconTheme = ProductIconThemeData.createUnloadedTheme(''); this.productIconThemeSequencer = new Sequencer(); - this._register(this.onDidColorThemeChange(theme => getColorRegistry().notifyThemeUpdate(theme))); + this._register(this.onDidColorThemeChange(e => getColorRegistry().notifyThemeUpdate(e.theme))); // In order to avoid paint flashing for tokens, because // themes are loaded asynchronously, we need to initialize @@ -277,7 +277,7 @@ export class WorkbenchThemeService extends Disposable implements IWorkbenchTheme } if (hasColorChanges) { this.updateDynamicCSSRules(this.currentColorTheme); - this.onColorThemeChange.fire(this.currentColorTheme); + this.onColorThemeChange.fire({ theme: this.currentColorTheme, target: 'auto' }); } } })); @@ -387,7 +387,7 @@ export class WorkbenchThemeService extends Disposable implements IWorkbenchTheme return []; } - public get onDidColorThemeChange(): Event { + public get onDidColorThemeChange(): Event { return this.onColorThemeChange.event; } @@ -506,7 +506,7 @@ export class WorkbenchThemeService extends Disposable implements IWorkbenchTheme return Promise.resolve(null); } - this.onColorThemeChange.fire(this.currentColorTheme); + this.onColorThemeChange.fire({ theme: this.currentColorTheme, target: settingsTarget }); // remember theme data for a quick restore if (newTheme.isLoaded && settingsTarget !== 'preview') { diff --git a/src/vs/workbench/services/themes/common/workbenchThemeService.ts b/src/vs/workbench/services/themes/common/workbenchThemeService.ts index 3806f1a2d6c06..4154648ee7817 100644 --- a/src/vs/workbench/services/themes/common/workbenchThemeService.ts +++ b/src/vs/workbench/services/themes/common/workbenchThemeService.ts @@ -6,7 +6,7 @@ import { refineServiceDecorator } from '../../../../platform/instantiation/common/instantiation.js'; import { Event } from '../../../../base/common/event.js'; import { Color } from '../../../../base/common/color.js'; -import { IColorTheme, IThemeService, IFileIconTheme, IProductIconTheme } from '../../../../platform/theme/common/themeService.js'; +import { IColorTheme, IThemeService, IFileIconTheme, IProductIconTheme, IThemeChangeEvent } from '../../../../platform/theme/common/themeService.js'; import { ConfigurationTarget } from '../../../../platform/configuration/common/configuration.js'; import { isBoolean, isString } from '../../../../base/common/types.js'; import { IconContribution, IconDefinition } from '../../../../platform/theme/common/iconRegistry.js'; @@ -132,7 +132,9 @@ export interface IWorkbenchProductIconTheme extends IWorkbenchTheme, IProductIco } export type ThemeSettingTarget = ConfigurationTarget | undefined | 'auto' | 'preview'; - +export interface IWorkbenchThemeChangeEvent extends IThemeChangeEvent { + target: ThemeSettingTarget; +} export interface IWorkbenchThemeService extends IThemeService { readonly _serviceBrand: undefined; @@ -140,7 +142,7 @@ export interface IWorkbenchThemeService extends IThemeService { getColorTheme(): IWorkbenchColorTheme; getColorThemes(): Promise; getMarketplaceColorThemes(publisher: string, name: string, version: string): Promise; - onDidColorThemeChange: Event; + onDidColorThemeChange: Event; getPreferredColorScheme(): ColorScheme | undefined; diff --git a/src/vs/workbench/services/treeSitter/browser/treeSitterCodeEditors.ts b/src/vs/workbench/services/treeSitter/browser/treeSitterCodeEditors.ts index 777ca784c73e3..46d0abab0e6d2 100644 --- a/src/vs/workbench/services/treeSitter/browser/treeSitterCodeEditors.ts +++ b/src/vs/workbench/services/treeSitter/browser/treeSitterCodeEditors.ts @@ -31,6 +31,10 @@ export class TreeSitterCodeEditors extends Disposable { this._codeEditorService.listCodeEditors().forEach(this._onCodeEditorAdd, this); } + get editors(): ICodeEditor[] { + return Array.from(this._editors.keys()); + } + public async getInitialViewPorts(): Promise { await this._treeSitterParserService.getLanguage(this._languageId); const editors = this._codeEditorService.listCodeEditors(); diff --git a/src/vs/workbench/services/treeSitter/browser/treeSitterTokenizationFeature.ts b/src/vs/workbench/services/treeSitter/browser/treeSitterTokenizationFeature.ts index 1e73074306c2d..af2447bea3b62 100644 --- a/src/vs/workbench/services/treeSitter/browser/treeSitterTokenizationFeature.ts +++ b/src/vs/workbench/services/treeSitter/browser/treeSitterTokenizationFeature.ts @@ -15,7 +15,6 @@ import { IConfigurationService } from '../../../../platform/configuration/common import { IFileService } from '../../../../platform/files/common/files.js'; import { InstantiationType, registerSingleton } from '../../../../platform/instantiation/common/extensions.js'; import { createDecorator, IInstantiationService } from '../../../../platform/instantiation/common/instantiation.js'; -import { IThemeService } from '../../../../platform/theme/common/themeService.js'; import { ColorThemeData, findMetadata } from '../../themes/common/colorThemeData.js'; import { ILanguageService } from '../../../../editor/common/languages/language.js'; import { StopWatch } from '../../../../base/common/stopwatch.js'; @@ -28,6 +27,7 @@ import { setTimeout0 } from '../../../../base/common/platform.js'; import { findLikelyRelevantLines } from '../../../../editor/common/model/textModelTokens.js'; import { TreeSitterCodeEditors } from './treeSitterCodeEditors.js'; import { Position } from '../../../../editor/common/core/position.js'; +import { IWorkbenchThemeChangeEvent, IWorkbenchThemeService } from '../../themes/common/workbenchThemeService.js'; type TreeSitterQueries = string; @@ -123,7 +123,7 @@ export class TreeSitterTokenizationSupport extends Disposable implements ITreeSi private readonly _languageId: string, private readonly _languageIdCodec: ILanguageIdCodec, @ITreeSitterParserService private readonly _treeSitterService: ITreeSitterParserService, - @IThemeService private readonly _themeService: IThemeService, + @IWorkbenchThemeService private readonly _themeService: IWorkbenchThemeService, @ITreeSitterTokenizationStoreService private readonly _tokenizationStoreService: ITreeSitterTokenizationStoreService, @ICodeEditorService private readonly _codeEditorService: ICodeEditorService, @IInstantiationService private readonly _instantiationService: IInstantiationService, @@ -138,7 +138,7 @@ export class TreeSitterTokenizationSupport extends Disposable implements ITreeSi this._parseAndTokenizeViewPort(viewport.model, viewport.ranges); } }); - this._register(Event.runAndSubscribe(this._themeService.onDidColorThemeChange, () => this.reset())); + this._register(Event.runAndSubscribe(this._themeService.onDidColorThemeChange, (e) => this._updateTheme(e))); let hasDoneFullTokenization = false; this._register(this._treeSitterService.onDidUpdateTree((e) => { if (e.textModel.getLanguageId() !== this._languageId) { @@ -438,8 +438,29 @@ export class TreeSitterTokenizationSupport extends Disposable implements ITreeSi return this._query; } - private reset() { + private _updateTheme(e: IWorkbenchThemeChangeEvent | undefined) { this._colorThemeData = this._themeService.getColorTheme() as ColorThemeData; + for (const editor of this._codeEditors.editors) { + const model = editor.getModel(); + if (model) { + const modelRange = model.getFullModelRange(); + this._tokenizationStoreService.markForRefresh(model, modelRange); + this._parseAndTokenizeViewPort(model, editor.getVisibleRangesPlusViewportAboveBelow()); + + if (e?.target !== 'preview') { + this._handleTreeUpdate({ + ranges: [{ + newRange: modelRange, + newRangeStartOffset: 0, + newRangeEndOffset: model.getValueLength(), + oldRangeLength: model.getValueLength() + }], + textModel: model, + versionId: model.getVersionId() + }); + } + } + } } captureAtPosition(lineNumber: number, column: number, textModel: ITextModel): QueryCapture[] {