@@ -991,31 +991,51 @@ bool SettingsLoader::_addOrMergeUserColorScheme(const winrt::com_ptr<implementat
991
991
void SettingsLoader::_executeGenerator (const IDynamicProfileGenerator& generator)
992
992
{
993
993
const auto generatorNamespace = generator.GetNamespace ();
994
- if (_ignoredNamespaces.contains (generatorNamespace))
995
- {
996
- return ;
997
- }
998
-
999
- const auto previousSize = inboxSettings.profiles .size ();
1000
-
994
+ std::vector<winrt::com_ptr<implementation::Profile>> generatedProfiles;
1001
995
try
1002
996
{
1003
- generator.GenerateProfiles (inboxSettings. profiles );
997
+ generator.GenerateProfiles (generatedProfiles );
1004
998
}
1005
999
CATCH_LOG_MSG (" Dynamic Profile Namespace: \" %.*s\" " , gsl::narrow<int >(generatorNamespace.size ()), generatorNamespace.data ())
1006
1000
1001
+ // These are needed for the FragmentSettings object
1002
+ std::vector<Model::FragmentProfileEntry> profileEntries;
1003
+ Json::Value profilesListJson{ Json::ValueType::arrayValue };
1004
+ Json::StreamWriterBuilder styledWriter;
1005
+ styledWriter[" indentation" ] = " " ;
1006
+
1007
1007
// If the generator produced some profiles we're going to give them default attributes.
1008
1008
// By setting the Origin/Source/etc. here, we deduplicate some code and ensure they aren't missing accidentally.
1009
- if (inboxSettings.profiles .size () > previousSize)
1009
+ const winrt::hstring source{ generatorNamespace };
1010
+ for (const auto & profile : generatedProfiles)
1010
1011
{
1011
- const winrt::hstring source{ generatorNamespace };
1012
+ profile->Origin (OriginTag::Generated);
1013
+ profile->Source (source);
1014
+
1015
+ const auto profileJson = profile->ToJson ();
1016
+ profilesListJson.append (profileJson);
1017
+ profileEntries.push_back (winrt::make<FragmentProfileEntry>(profile->Guid (), hstring{ til::u8u16 (Json::writeString (styledWriter, profileJson)) }));
1018
+ }
1012
1019
1013
- for (const auto & profile : std::span (inboxSettings.profiles ).subspan (previousSize))
1020
+ if (!_ignoredNamespaces.contains (generatorNamespace))
1021
+ {
1022
+ // Add generated profiles to the user settings
1023
+ for (auto & profile : generatedProfiles)
1014
1024
{
1015
- profile->Origin (OriginTag::Generated);
1016
- profile->Source (source);
1025
+ inboxSettings.profiles .push_back (profile);
1017
1026
}
1018
1027
}
1028
+
1029
+ // Manually construct the JSON for the FragmentSettings object
1030
+ Json::Value json{ Json::ValueType::objectValue };
1031
+ json[JsonKey (ProfilesKey)] = profilesListJson;
1032
+
1033
+ auto generatorExtension = winrt::make_self<FragmentSettings>(hstring{ generatorNamespace }, hstring{ til::u8u16 (Json::writeString (styledWriter, json)) }, hstring{ L" settings.json" }, FragmentScope::Machine);
1034
+ for (const auto & entry : profileEntries)
1035
+ {
1036
+ generatorExtension->NewProfiles ().Append (entry);
1037
+ }
1038
+ dynamicProfileGeneratorExtensions.emplace_back (*generatorExtension);
1019
1039
}
1020
1040
1021
1041
// Method Description:
@@ -1308,6 +1328,7 @@ CascadiaSettings::CascadiaSettings(SettingsLoader&& loader) :
1308
1328
_warnings = winrt::single_threaded_vector (std::move (warnings));
1309
1329
_themesChangeLog = std::move (loader.userSettings .themesChangeLog );
1310
1330
_fragmentExtensions = winrt::single_threaded_vector (std::move (loader.fragmentExtensions ));
1331
+ _dynamicProfileGeneratorExtensions = winrt::single_threaded_vector (std::move (loader.dynamicProfileGeneratorExtensions ));
1311
1332
1312
1333
_resolveDefaultProfile ();
1313
1334
_resolveNewTabMenuProfiles ();
0 commit comments