Change:
It would be nice if icons would show up directly after starting the workbench instead of having to wait for the extension host to be ready. Similar to color themes where the data is stored in local storage, the icons data should also be stored so that the overall experience is smooth.
can we consider this for this milestone? I want to mark this "perf-startup" because the fact that the icons only "kick in" later after the UI is already done makes the entire editor appear like a website that needs to load icons later separately which is ugly. It also causes some ugly jumping for opened tabs. ! /cc
PR:

Discussion:
} return themeData; } <ins> static fromStorageData(input: string): FileIconThemeData { try { let data = JSON.parse(input); let theme = new FileIconThemeData(); for (let key in data) { switch (key) { case 'id': case 'label': case 'description': case 'settingsId': case 'extensionData': case 'path': theme[key] = data[key]; break; } } return theme; } catch (e) { return null; } } toStorageData() { return JSON.stringify({ id: this.id, label: this.label, description: this.description, settingsId: this.settingsId, path: this.path, extensionData: this.extensionData }); } </ins> } interface IconDefinition {

const DEFAULT_THEME_SETTING_VALUE = 'Default Dark+'; const PERSISTED_THEME_STORAGE_KEY = 'colorThemeData'; <ins> const PERSISTED_ICON_THEME_STORAGE_KEY = 'iconThemeData'; </ins> const defaultThemeExtensionId = 'vscode-theme-defaults'; const oldDefaultThemeExtensionId = 'vscode-theme-colorful-defaults';

this.updateDynamicCSSRules(themeData); this.applyTheme(themeData, null, true); <ins> let iconData: FileIconThemeData = null; let persistedIconThemeData = this.storageService.get(PERSISTED_ICON_THEME_STORAGE_KEY); if (persistedIconThemeData) { iconData = FileIconThemeData.fromStorageData(persistedIconThemeData); if (iconData) { _applyIconTheme(iconData, () => { this.doSetFileIconTheme(iconData); return TPromise.wrap(iconData); }); } } </ins> this.initialize().then(null, errors.onUnexpectedError).then(_ => { this.installConfigurationListener(); });

return this.writeFileIconConfiguration(settingsTarget); } let onApply = (newIconTheme: FileIconThemeData) => { <ins> this.doSetFileIconTheme(newIconTheme); // remember theme data for a quick restore </ins> if (newIconTheme) { <del> this.currentIconTheme = newIconTheme; </del> <ins> this.storageService.store(PERSISTED_ICON_THEME_STORAGE_KEY, newIconTheme.toStorageData()); </ins> } else { <del> this.currentIconTheme = FileIconThemeData.noIconTheme(); </del> <ins> this.storageService.remove(PERSISTED_ICON_THEME_STORAGE_KEY); </ins> } <del> if (this.container) { if (newIconTheme) { $(this.container).addClass(fileIconsEnabledClass); } else { $(this.container).removeClass(fileIconsEnabledClass); } } if (newIconTheme) { this.sendTelemetry(newIconTheme.id, newIconTheme.extensionData, 'fileIcon'); } this.onFileIconThemeChange.fire(this.currentIconTheme); </del> return this.writeFileIconConfiguration(settingsTarget); };

}); } <ins> private doSetFileIconTheme(iconThemeData: FileIconThemeData): void { if (iconThemeData) { this.currentIconTheme = iconThemeData; } else { this.currentIconTheme = FileIconThemeData.noIconTheme(); } if (this.container) { if (iconThemeData) { $(this.container).addClass(fileIconsEnabledClass); } else { $(this.container).removeClass(fileIconsEnabledClass); } } if (iconThemeData) { this.sendTelemetry(iconThemeData.id, iconThemeData.extensionData, 'fileIcon'); } this.onFileIconThemeChange.fire(this.currentIconTheme); } </ins> private writeFileIconConfiguration(settingsTarget: ConfigurationTarget): TPromise<IFileIconTheme> { if (!types.isUndefinedOrNull(settingsTarget)) { return this.configurationWriter.writeConfiguration(ICON_THEME_SETTING, this.currentIconTheme.settingsId, settingsTarget).then(_ => this.currentIconTheme);