/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ //@ts-check 'use strict'; const perf = require('../../../base/common/performance'); perf.mark('renderer/started'); const bootstrapWindow = require('../../../../bootstrap-window'); // Setup shell environment process['lazyEnv'] = getLazyEnv(); // Load workbench main bootstrapWindow.load([ 'vs/workbench/workbench.desktop.main', 'vs/nls!vs/workbench/workbench.desktop.main', 'vs/css!vs/workbench/workbench.desktop.main' ], function (workbench, configuration) { perf.mark('didLoadWorkbenchMain'); return process['lazyEnv'].then(function () { perf.mark('main/startup'); // @ts-ignore return require('vs/workbench/electron-browser/desktop.main').main(configuration); }); }, { removeDeveloperKeybindingsAfterLoad: true, canModifyDOM: function (windowConfig) { showPartsSplash(windowConfig); }, beforeLoaderConfig: function (windowConfig, loaderConfig) { loaderConfig.recordStats = true; }, beforeRequire: function () { perf.mark('willLoadWorkbenchMain'); } }); /** * @param {{ * partsSplashPath?: string, * highContrast?: boolean, * extensionDevelopmentPath?: string | string[], * folderUri?: object, * workspace?: object * }} configuration */ function showPartsSplash(configuration) { perf.mark('willShowPartsSplash'); let data; if (typeof configuration.partsSplashPath === 'string') { try { data = JSON.parse(require('fs').readFileSync(configuration.partsSplashPath, 'utf8')); } catch (e) { // ignore } } // high contrast mode has been turned on from the outside, e.g. OS -> ignore stored colors and layouts if (data && configuration.highContrast && data.baseTheme !== 'hc-black') { data = undefined; } // developing an extension -> ignore stored layouts if (data && configuration.extensionDevelopmentPath) { data.layoutInfo = undefined; } // minimal color configuration (works with or without persisted data) const baseTheme = data ? data.baseTheme : configuration.highContrast ? 'hc-black' : 'vs-dark'; const shellBackground = data ? data.colorInfo.editorBackground : configuration.highContrast ? '#000000' : '#1E1E1E'; const shellForeground = data ? data.colorInfo.foreground : configuration.highContrast ? '#FFFFFF' : '#CCCCCC'; const style = document.createElement('style'); style.className = 'initialShellColors'; document.head.appendChild(style); document.body.className = baseTheme; style.innerHTML = `body { background-color: ${shellBackground}; color: ${shellForeground}; }`; if (data && data.layoutInfo) { // restore parts if possible (we might not always store layout info) const { id, layoutInfo, colorInfo } = data; const splash = document.createElement('div'); splash.id = id; // ensure there is enough space layoutInfo.sideBarWidth = Math.min(layoutInfo.sideBarWidth, window.innerWidth - (layoutInfo.activityBarWidth + layoutInfo.editorPartMinWidth)); if (configuration.folderUri || configuration.workspace) { // folder or workspace -> status bar color, sidebar splash.innerHTML = `
`; } else { // empty -> speical status bar color, no sidebar splash.innerHTML = `
`; } document.body.appendChild(splash); } perf.mark('didShowPartsSplash'); } /** * @returns {Promise} */ function getLazyEnv() { // @ts-ignore const ipc = require('electron').ipcRenderer; return new Promise(function (resolve) { const handle = setTimeout(function () { resolve(); console.warn('renderer did not receive lazyEnv in time'); }, 10000); ipc.once('vscode:acceptShellEnv', function (event, shellEnv) { clearTimeout(handle); bootstrapWindow.assign(process.env, shellEnv); // @ts-ignore resolve(process.env); }); ipc.send('vscode:fetchShellEnv'); }); }