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