diff --git a/src/vs/code/browser/workbench/workbench.html b/src/vs/code/browser/workbench/workbench.html index 647bb7d0391..1e742447047 100644 --- a/src/vs/code/browser/workbench/workbench.html +++ b/src/vs/code/browser/workbench/workbench.html @@ -24,7 +24,7 @@ - + diff --git a/src/vs/code/electron-browser/workbench/workbench.js b/src/vs/code/electron-browser/workbench/workbench.js index f9f21d89bf2..dfe41b3d93d 100644 --- a/src/vs/code/electron-browser/workbench/workbench.js +++ b/src/vs/code/electron-browser/workbench/workbench.js @@ -43,7 +43,6 @@ bootstrapWindow.load([ }); /** - * // configuration: IWindowConfiguration * @param {{ * partsSplashPath?: string, * highContrast?: boolean, diff --git a/src/vs/workbench/browser/layout.ts b/src/vs/workbench/browser/layout.ts index 97c19de5d1f..7e6bfaa4a30 100644 --- a/src/vs/workbench/browser/layout.ts +++ b/src/vs/workbench/browser/layout.ts @@ -557,6 +557,10 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi return offset; } + getWorkbenchContainer(): HTMLElement { + return this.parent; + } + getWorkbenchElement(): HTMLElement { return this.container; } diff --git a/src/vs/workbench/browser/web.main.ts b/src/vs/workbench/browser/web.main.ts index 8a349d03658..d5f9cff6493 100644 --- a/src/vs/workbench/browser/web.main.ts +++ b/src/vs/workbench/browser/web.main.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { mark } from 'vs/base/common/performance'; -import { domContentLoaded, addDisposableListener, EventType } from 'vs/base/browser/dom'; +import { domContentLoaded, addDisposableListener, EventType, addClass } from 'vs/base/browser/dom'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; import { ILogService } from 'vs/platform/log/common/log'; import { Disposable } from 'vs/base/common/lifecycle'; @@ -39,6 +39,7 @@ import { BACKUPS } from 'vs/platform/environment/common/environment'; import { joinPath } from 'vs/base/common/resources'; import { BrowserStorageService } from 'vs/platform/storage/browser/storageService'; import { IStorageService } from 'vs/platform/storage/common/storage'; +import { getThemeTypeSelector, DARK, HIGH_CONTRAST, LIGHT } from 'vs/platform/theme/common/themeService'; class CodeRendererMain extends Disposable { @@ -57,6 +58,9 @@ class CodeRendererMain extends Disposable { await domContentLoaded(); mark('willStartWorkbench'); + // Base Theme + this.restoreBaseTheme(); + // Create Workbench this.workbench = new Workbench( this.domElement, @@ -69,12 +73,30 @@ class CodeRendererMain extends Disposable { // Workbench Lifecycle this._register(this.workbench.onShutdown(() => this.dispose())); - this._register(this.workbench.onWillShutdown(() => services.storageService.close())); + this._register(this.workbench.onWillShutdown(() => { + services.storageService.close(); + this.saveBaseTheme(); + })); // Startup this.workbench.startup(); } + private restoreBaseTheme(): void { + addClass(this.domElement, window.localStorage.getItem('baseTheme') || getThemeTypeSelector(DARK)); + } + + private saveBaseTheme(): void { + const classes = this.domElement.className; + const baseThemes = [DARK, LIGHT, HIGH_CONTRAST].map(baseTheme => getThemeTypeSelector(baseTheme)); + for (const baseTheme of baseThemes) { + if (classes.indexOf(baseTheme) >= 0) { + window.localStorage.setItem('baseTheme', baseTheme); + break; + } + } + } + private async initServices(): Promise<{ serviceCollection: ServiceCollection, logService: ILogService, storageService: BrowserStorageService }> { const serviceCollection = new ServiceCollection(); diff --git a/src/vs/workbench/services/layout/browser/layoutService.ts b/src/vs/workbench/services/layout/browser/layoutService.ts index c89bbef87c1..d0bf836984f 100644 --- a/src/vs/workbench/services/layout/browser/layoutService.ts +++ b/src/vs/workbench/services/layout/browser/layoutService.ts @@ -138,6 +138,11 @@ export interface IWorkbenchLayoutService extends ILayoutService { */ setPanelPosition(position: Position): void; + /** + * Returns the element that is parent of the workbench element. + */ + getWorkbenchContainer(): HTMLElement; + /** * Returns the element that contains the workbench. */ diff --git a/src/vs/workbench/services/themes/browser/workbenchThemeService.ts b/src/vs/workbench/services/themes/browser/workbenchThemeService.ts index 84cf2bb355b..cf5e181779a 100644 --- a/src/vs/workbench/services/themes/browser/workbenchThemeService.ts +++ b/src/vs/workbench/services/themes/browser/workbenchThemeService.ts @@ -31,6 +31,7 @@ import { textmateColorsSchemaId, registerColorThemeSchemas, textmateColorSetting import { workbenchColorsSchemaId } from 'vs/platform/theme/common/colorRegistry'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { getRemoteAuthority } from 'vs/platform/remote/common/remoteHosts'; +import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService'; // implementation @@ -96,10 +97,11 @@ export class WorkbenchThemeService implements IWorkbenchThemeService { @IConfigurationService private readonly configurationService: IConfigurationService, @ITelemetryService private readonly telemetryService: ITelemetryService, @IWorkbenchEnvironmentService private readonly environmentService: IWorkbenchEnvironmentService, - @IFileService private readonly fileService: IFileService + @IFileService private readonly fileService: IFileService, + @IWorkbenchLayoutService readonly layoutService: IWorkbenchLayoutService ) { - this.container = document.body; + this.container = layoutService.getWorkbenchContainer(); this.colorThemeStore = new ColorThemeStore(extensionService, ColorThemeData.createLoadedEmptyTheme(DEFAULT_THEME_ID, DEFAULT_THEME_SETTING_VALUE)); this.onFileIconThemeChange = new Emitter(); this.iconThemeStore = new FileIconThemeStore(extensionService); @@ -385,14 +387,13 @@ export class WorkbenchThemeService implements IWorkbenchThemeService { } private applyTheme(newTheme: ColorThemeData, settingsTarget: ConfigurationTarget | undefined | 'auto', silent = false): Promise { - if (this.container) { - if (this.currentColorTheme) { - removeClasses(this.container, this.currentColorTheme.id); - } else { - removeClasses(this.container, VS_DARK_THEME, VS_LIGHT_THEME, VS_HC_THEME); - } - addClasses(this.container, newTheme.id); + if (this.currentColorTheme) { + removeClasses(this.container, this.currentColorTheme.id); + } else { + removeClasses(this.container, VS_DARK_THEME, VS_LIGHT_THEME, VS_HC_THEME); } + addClasses(this.container, newTheme.id); + this.currentColorTheme = newTheme; if (!this.themingParticipantChangeListener) { this.themingParticipantChangeListener = themingRegistry.onThemingParticipantAdded(_ => this.updateDynamicCSSRules(this.currentColorTheme)); @@ -512,12 +513,10 @@ export class WorkbenchThemeService implements IWorkbenchThemeService { private doSetFileIconTheme(iconThemeData: FileIconThemeData): void { this.currentIconTheme = iconThemeData; - if (this.container) { - if (iconThemeData.id) { - addClasses(this.container, fileIconsEnabledClass); - } else { - removeClasses(this.container, fileIconsEnabledClass); - } + if (iconThemeData.id) { + addClasses(this.container, fileIconsEnabledClass); + } else { + removeClasses(this.container, fileIconsEnabledClass); } if (this.fileService && !resources.isEqual(iconThemeData.location, this.watchedIconThemeLocation)) { @@ -574,12 +573,10 @@ export class WorkbenchThemeService implements IWorkbenchThemeService { } private getBaseThemeFromContainer() { - if (this.container) { - for (let i = this.container.classList.length - 1; i >= 0; i--) { - const item = document.body.classList.item(i); - if (item === VS_LIGHT_THEME || item === VS_DARK_THEME || item === VS_HC_THEME) { - return item; - } + for (let i = this.container.classList.length - 1; i >= 0; i--) { + const item = this.container.classList.item(i); + if (item === VS_LIGHT_THEME || item === VS_DARK_THEME || item === VS_HC_THEME) { + return item; } } return VS_DARK_THEME; diff --git a/src/vs/workbench/test/workbenchTestServices.ts b/src/vs/workbench/test/workbenchTestServices.ts index 9c44fd4c3af..3a383fb6cc7 100644 --- a/src/vs/workbench/test/workbenchTestServices.ts +++ b/src/vs/workbench/test/workbenchTestServices.ts @@ -534,6 +534,8 @@ export class TestLayoutService implements IWorkbenchLayoutService { public addClass(_clazz: string): void { } public removeClass(_clazz: string): void { } + + public getWorkbenchContainer(): HTMLElement { throw new Error('not implemented'); } public getWorkbenchElement(): HTMLElement { throw new Error('not implemented'); } public toggleZenMode(): void { }