diff --git a/src/cascadia/TerminalSettingsModel/CascadiaSettings.cpp b/src/cascadia/TerminalSettingsModel/CascadiaSettings.cpp index 5971d1e7b9..e22905d365 100644 --- a/src/cascadia/TerminalSettingsModel/CascadiaSettings.cpp +++ b/src/cascadia/TerminalSettingsModel/CascadiaSettings.cpp @@ -43,6 +43,16 @@ winrt::com_ptr Model::implementation::CreateChild(const winrt::com_ptr< return profile; } +std::string_view Model::implementation::LoadStringResource(int resourceID) +{ + const HINSTANCE moduleInstanceHandle{ wil::GetModuleInstanceHandle() }; + const auto resource = FindResourceW(moduleInstanceHandle, MAKEINTRESOURCEW(resourceID), RT_RCDATA); + const auto loaded = LoadResource(moduleInstanceHandle, resource); + const auto sz = SizeofResource(moduleInstanceHandle, resource); + const auto ptr = LockResource(loaded); + return { reinterpret_cast(ptr), sz }; +} + winrt::hstring CascadiaSettings::Hash() const noexcept { return _hash; diff --git a/src/cascadia/TerminalSettingsModel/CascadiaSettings.h b/src/cascadia/TerminalSettingsModel/CascadiaSettings.h index 4180c8d8c3..03f3ea071e 100644 --- a/src/cascadia/TerminalSettingsModel/CascadiaSettings.h +++ b/src/cascadia/TerminalSettingsModel/CascadiaSettings.h @@ -29,6 +29,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model namespace winrt::Microsoft::Terminal::Settings::Model::implementation { + std::string_view LoadStringResource(int resourceID); winrt::com_ptr CreateChild(const winrt::com_ptr& parent); class SettingsTypedDeserializationException final : public std::runtime_error diff --git a/src/cascadia/TerminalSettingsModel/CascadiaSettingsSerialization.cpp b/src/cascadia/TerminalSettingsModel/CascadiaSettingsSerialization.cpp index e3796a9b7d..fc2cc56262 100644 --- a/src/cascadia/TerminalSettingsModel/CascadiaSettingsSerialization.cpp +++ b/src/cascadia/TerminalSettingsModel/CascadiaSettingsSerialization.cpp @@ -8,6 +8,7 @@ #include #include #include +#include "resource.h" #include "AzureCloudShellGenerator.h" #include "PowershellCoreProfileGenerator.h" @@ -17,15 +18,9 @@ #include "SshHostGenerator.h" #endif -// The following files are generated at build time into the "Generated Files" directory. -// defaults.h is a file containing the default json settings in a std::string_view. -#include "defaults.h" // userDefault.h is like the above, but with a default template for the user's settings.json. #include -#include "userDefaults.h" -#include "enableColorSelection.h" - #include "ApplicationState.h" #include "DefaultTerminal.h" #include "FileUtils.h" @@ -349,7 +344,7 @@ void SettingsLoader::FinalizeLayering() // actions, this is the time to do it. if (userSettings.globals->EnableColorSelection()) { - const auto json = _parseJson(EnableColorSelectionSettingsJson); + const auto json = _parseJson(LoadStringResource(IDR_ENABLE_COLOR_SELECTION)); const auto globals = GlobalAppSettings::FromJson(json.root); userSettings.globals->AddLeastImportantParent(globals); } @@ -972,10 +967,10 @@ try // Only uses default settings when firstTimeSetup is true and releaseSettingExists is false // Otherwise use existing settingsString - const auto settingsStringView = (firstTimeSetup && !releaseSettingExists) ? UserSettingsJson : settingsString; + const auto settingsStringView = (firstTimeSetup && !releaseSettingExists) ? LoadStringResource(IDR_USER_DEFAULTS) : settingsString; auto mustWriteToDisk = firstTimeSetup; - SettingsLoader loader{ settingsStringView, DefaultJson }; + SettingsLoader loader{ settingsStringView, LoadStringResource(IDR_DEFAULTS) }; // Generate dynamic profiles and add them as parents of user profiles. // That way the user profiles will get appropriate defaults from the generators (like icons and such). @@ -1127,7 +1122,7 @@ void CascadiaSettings::_researchOnLoad() // - a unique_ptr to a CascadiaSettings with the settings from defaults.json Model::CascadiaSettings CascadiaSettings::LoadDefaults() { - return *winrt::make_self(std::string_view{}, DefaultJson); + return *winrt::make_self(std::string_view{}, LoadStringResource(IDR_DEFAULTS)); } CascadiaSettings::CascadiaSettings(const winrt::hstring& userJSON, const winrt::hstring& inboxJSON) : diff --git a/src/cascadia/TerminalSettingsModel/Microsoft.Terminal.Settings.Model.rc b/src/cascadia/TerminalSettingsModel/Microsoft.Terminal.Settings.Model.rc new file mode 100644 index 0000000000..31fe4f8b5a --- /dev/null +++ b/src/cascadia/TerminalSettingsModel/Microsoft.Terminal.Settings.Model.rc @@ -0,0 +1,31 @@ +// Microsoft Visual C++ generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(65001) + +///////////////////////////////////////////////////////////////////////////// +// +// RCDATA +// +IDR_DEFAULTS RCDATA "Generated Files\defaults.json" +IDR_USER_DEFAULTS RCDATA "Generated Files\userDefaults.json" +IDR_ENABLE_COLOR_SELECTION RCDATA "Generated Files\enableColorSelection.json" + +#endif // English (United States) resources +///////////////////////////////////////////////////////////////////////////// diff --git a/src/cascadia/TerminalSettingsModel/Microsoft.Terminal.Settings.ModelLib.vcxproj b/src/cascadia/TerminalSettingsModel/Microsoft.Terminal.Settings.ModelLib.vcxproj index 7175aa6e67..31e4844eb0 100644 --- a/src/cascadia/TerminalSettingsModel/Microsoft.Terminal.Settings.ModelLib.vcxproj +++ b/src/cascadia/TerminalSettingsModel/Microsoft.Terminal.Settings.ModelLib.vcxproj @@ -20,6 +20,7 @@ + NewTabMenuEntry.idl @@ -238,6 +239,9 @@ + + + - - - - - - - - - - - - - - - - - - + + + + + + + diff --git a/src/cascadia/TerminalSettingsModel/dll/Microsoft.Terminal.Settings.Model.vcxproj b/src/cascadia/TerminalSettingsModel/dll/Microsoft.Terminal.Settings.Model.vcxproj index e0d14ec3c1..06e26727ed 100644 --- a/src/cascadia/TerminalSettingsModel/dll/Microsoft.Terminal.Settings.Model.vcxproj +++ b/src/cascadia/TerminalSettingsModel/dll/Microsoft.Terminal.Settings.Model.vcxproj @@ -129,7 +129,7 @@ $(OpenConsoleDir)\dep\jsoncpp\json;%(AdditionalIncludeDirectories); - %(AdditionalDependencies);user32.lib + %(AdditionalDependencies);user32.lib;$(IntDir)\..\Microsoft.Terminal.Settings.Model.lib\Microsoft.Terminal.Settings.Model.res /INCLUDE:_DllMain@12 %(AdditionalOptions) /INCLUDE:DllMain %(AdditionalOptions) diff --git a/src/cascadia/TerminalSettingsModel/resource.h b/src/cascadia/TerminalSettingsModel/resource.h new file mode 100644 index 0000000000..b6ce1d9cfb --- /dev/null +++ b/src/cascadia/TerminalSettingsModel/resource.h @@ -0,0 +1,7 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by WindowsTerminal.rc +// +#define IDR_DEFAULTS 101 +#define IDR_USER_DEFAULTS 102 +#define IDR_ENABLE_COLOR_SELECTION 103 diff --git a/src/cascadia/UnitTests_SettingsModel/DeserializationTests.cpp b/src/cascadia/UnitTests_SettingsModel/DeserializationTests.cpp index e546cf3305..2425e3421d 100644 --- a/src/cascadia/UnitTests_SettingsModel/DeserializationTests.cpp +++ b/src/cascadia/UnitTests_SettingsModel/DeserializationTests.cpp @@ -5,12 +5,10 @@ #include "../TerminalSettingsModel/ColorScheme.h" #include "../TerminalSettingsModel/CascadiaSettings.h" +#include "../TerminalSettingsModel/resource.h" #include "JsonTestClass.h" #include "TestUtils.h" -#include -#include - using namespace Microsoft::Console; using namespace WEX::Logging; using namespace WEX::TestExecution; @@ -541,7 +539,7 @@ namespace SettingsModelUnitTests ] })" }; - const auto settings = winrt::make_self(settings0String, DefaultJson); + const auto settings = winrt::make_self(settings0String, implementation::LoadStringResource(IDR_DEFAULTS)); VERIFY_ARE_EQUAL(0u, settings->Warnings().Size()); VERIFY_ARE_EQUAL(4u, settings->AllProfiles().Size()); @@ -619,7 +617,7 @@ namespace SettingsModelUnitTests ] })" }; - const auto settings = winrt::make_self(settings0String, DefaultJson); + const auto settings = winrt::make_self(settings0String, implementation::LoadStringResource(IDR_DEFAULTS)); VERIFY_ARE_EQUAL(0u, settings->Warnings().Size()); VERIFY_ARE_EQUAL(4u, settings->AllProfiles().Size()); @@ -656,7 +654,7 @@ namespace SettingsModelUnitTests ] })" }; - const auto settings = winrt::make_self(settings0String, DefaultJson); + const auto settings = winrt::make_self(settings0String, implementation::LoadStringResource(IDR_DEFAULTS)); const auto profiles = settings->AllProfiles(); VERIFY_ARE_EQUAL(5u, profiles.Size()); VERIFY_ARE_EQUAL(L"ThisProfileIsGood", profiles.GetAt(0).Name()); @@ -1065,7 +1063,7 @@ namespace SettingsModelUnitTests const auto guid1String = L"{6239a42c-1111-49a3-80bd-e8fdd045185c}"; const winrt::guid guid1{ Utils::GuidFromString(guid1String) }; - const auto settings = winrt::make_self(settings0String, DefaultJson); + const auto settings = winrt::make_self(settings0String, implementation::LoadStringResource(IDR_DEFAULTS)); VERIFY_ARE_EQUAL(guid1String, settings->GlobalSettings().UnparsedDefaultProfile()); VERIFY_ARE_EQUAL(4u, settings->AllProfiles().Size()); @@ -2006,7 +2004,7 @@ namespace SettingsModelUnitTests ] })" }; - implementation::SettingsLoader loader{ std::string_view{}, DefaultJson }; + implementation::SettingsLoader loader{ std::string_view{}, implementation::LoadStringResource(IDR_DEFAULTS) }; loader.MergeInboxIntoUserSettings(); loader.MergeFragmentIntoUserSettings(winrt::hstring{ fragmentSource }, fragmentJson); loader.FinalizeLayering(); @@ -2029,7 +2027,7 @@ namespace SettingsModelUnitTests ] })" }; - implementation::SettingsLoader loader{ std::string_view{}, DefaultJson }; + implementation::SettingsLoader loader{ std::string_view{}, implementation::LoadStringResource(IDR_DEFAULTS) }; loader.MergeInboxIntoUserSettings(); loader.MergeFragmentIntoUserSettings(winrt::hstring{ fragmentSource }, fragmentJson); loader.FinalizeLayering(); @@ -2054,7 +2052,7 @@ namespace SettingsModelUnitTests ] })" }; - implementation::SettingsLoader loader{ std::string_view{}, DefaultJson }; + implementation::SettingsLoader loader{ std::string_view{}, implementation::LoadStringResource(IDR_DEFAULTS) }; loader.MergeInboxIntoUserSettings(); loader.MergeFragmentIntoUserSettings(winrt::hstring{ fragmentSource }, fragmentJson); loader.FinalizeLayering(); @@ -2088,7 +2086,7 @@ namespace SettingsModelUnitTests ] })" }; - implementation::SettingsLoader loader{ std::string_view{}, DefaultJson }; + implementation::SettingsLoader loader{ std::string_view{}, implementation::LoadStringResource(IDR_DEFAULTS) }; loader.MergeInboxIntoUserSettings(); loader.MergeFragmentIntoUserSettings(winrt::hstring{ fragmentSource }, fragmentJson); loader.FinalizeLayering(); @@ -2123,7 +2121,7 @@ namespace SettingsModelUnitTests ] })" }; - implementation::SettingsLoader loader{ std::string_view{}, DefaultJson }; + implementation::SettingsLoader loader{ std::string_view{}, implementation::LoadStringResource(IDR_DEFAULTS) }; loader.MergeInboxIntoUserSettings(); loader.MergeFragmentIntoUserSettings(winrt::hstring{ fragmentSource }, fragmentJson); loader.FinalizeLayering(); @@ -2149,7 +2147,7 @@ namespace SettingsModelUnitTests ] })" }; - implementation::SettingsLoader loader{ std::string_view{}, DefaultJson }; + implementation::SettingsLoader loader{ std::string_view{}, implementation::LoadStringResource(IDR_DEFAULTS) }; loader.MergeInboxIntoUserSettings(); loader.MergeFragmentIntoUserSettings(winrt::hstring{ fragmentSource }, fragmentJson); loader.FinalizeLayering(); @@ -2175,7 +2173,7 @@ namespace SettingsModelUnitTests ] })" }; - implementation::SettingsLoader loader{ std::string_view{}, DefaultJson }; + implementation::SettingsLoader loader{ std::string_view{}, implementation::LoadStringResource(IDR_DEFAULTS) }; loader.MergeInboxIntoUserSettings(); loader.MergeFragmentIntoUserSettings(winrt::hstring{ fragmentSource }, fragmentJson); loader.FinalizeLayering(); @@ -2189,7 +2187,7 @@ namespace SettingsModelUnitTests const auto oldResult{ oldSettings->ToJson() }; Log::Comment(L"Now, create a _new_ settings object from the re-serialization of the first"); - implementation::SettingsLoader newLoader{ toString(oldResult), DefaultJson }; + implementation::SettingsLoader newLoader{ toString(oldResult), implementation::LoadStringResource(IDR_DEFAULTS) }; // NOTABLY! Don't load the fragment here. newLoader.MergeInboxIntoUserSettings(); newLoader.FinalizeLayering(); @@ -2223,7 +2221,7 @@ namespace SettingsModelUnitTests ] })" }; - implementation::SettingsLoader loader{ settings1Json, DefaultJson }; + implementation::SettingsLoader loader{ settings1Json, implementation::LoadStringResource(IDR_DEFAULTS) }; loader.MergeInboxIntoUserSettings(); loader.FinalizeLayering(); diff --git a/src/cascadia/UnitTests_SettingsModel/NewTabMenuTests.cpp b/src/cascadia/UnitTests_SettingsModel/NewTabMenuTests.cpp index d5bc0a7516..f144e1728b 100644 --- a/src/cascadia/UnitTests_SettingsModel/NewTabMenuTests.cpp +++ b/src/cascadia/UnitTests_SettingsModel/NewTabMenuTests.cpp @@ -6,11 +6,10 @@ #include "../TerminalSettingsModel/NewTabMenuEntry.h" #include "../TerminalSettingsModel/FolderEntry.h" #include "../TerminalSettingsModel/CascadiaSettings.h" +#include "../TerminalSettingsModel/resource.h" #include "../types/inc/colorTable.hpp" #include "JsonTestClass.h" -#include - using namespace Microsoft::Console; using namespace winrt::Microsoft::Terminal; using namespace winrt::Microsoft::Terminal::Settings::Model::implementation; @@ -37,7 +36,7 @@ namespace SettingsModelUnitTests try { - const auto settings{ winrt::make_self(settingsString, DefaultJson) }; + const auto settings{ winrt::make_self(settingsString, LoadStringResource(IDR_DEFAULTS)) }; VERIFY_ARE_EQUAL(0u, settings->Warnings().Size()); @@ -71,7 +70,7 @@ namespace SettingsModelUnitTests try { - const auto settings{ winrt::make_self(settingsString, DefaultJson) }; + const auto settings{ winrt::make_self(settingsString, LoadStringResource(IDR_DEFAULTS)) }; VERIFY_ARE_EQUAL(0u, settings->Warnings().Size()); diff --git a/src/cascadia/UnitTests_SettingsModel/ProfileTests.cpp b/src/cascadia/UnitTests_SettingsModel/ProfileTests.cpp index 047d3c89cf..214d39af58 100644 --- a/src/cascadia/UnitTests_SettingsModel/ProfileTests.cpp +++ b/src/cascadia/UnitTests_SettingsModel/ProfileTests.cpp @@ -5,10 +5,9 @@ #include "../TerminalSettingsModel/ColorScheme.h" #include "../TerminalSettingsModel/CascadiaSettings.h" +#include "../TerminalSettingsModel/resource.h" #include "JsonTestClass.h" -#include - using namespace Microsoft::Console; using namespace winrt::Microsoft::Terminal::Settings::Model; using namespace WEX::Logging; diff --git a/src/cascadia/UnitTests_SettingsModel/SerializationTests.cpp b/src/cascadia/UnitTests_SettingsModel/SerializationTests.cpp index c75da633ac..455c0b78c2 100644 --- a/src/cascadia/UnitTests_SettingsModel/SerializationTests.cpp +++ b/src/cascadia/UnitTests_SettingsModel/SerializationTests.cpp @@ -5,9 +5,9 @@ #include "../TerminalSettingsModel/ColorScheme.h" #include "../TerminalSettingsModel/CascadiaSettings.h" +#include "../TerminalSettingsModel/resource.h" #include "JsonTestClass.h" #include "TestUtils.h" -#include using namespace Microsoft::Console; using namespace WEX::Logging; @@ -588,14 +588,14 @@ namespace SettingsModelUnitTests ] })" }; - implementation::SettingsLoader oldLoader{ oldSettingsJson, DefaultJson }; + implementation::SettingsLoader oldLoader{ oldSettingsJson, implementation::LoadStringResource(IDR_DEFAULTS) }; oldLoader.MergeInboxIntoUserSettings(); oldLoader.FinalizeLayering(); VERIFY_IS_TRUE(oldLoader.FixupUserSettings(), L"Validate that this will indicate we need to write them back to disk"); const auto oldSettings = winrt::make_self(std::move(oldLoader)); const auto oldResult{ oldSettings->ToJson() }; - implementation::SettingsLoader newLoader{ newSettingsJson, DefaultJson }; + implementation::SettingsLoader newLoader{ newSettingsJson, implementation::LoadStringResource(IDR_DEFAULTS) }; newLoader.MergeInboxIntoUserSettings(); newLoader.FinalizeLayering(); newLoader.FixupUserSettings(); @@ -630,7 +630,7 @@ namespace SettingsModelUnitTests ] })" }; - implementation::SettingsLoader oldLoader{ oldSettingsJson, DefaultJson }; + implementation::SettingsLoader oldLoader{ oldSettingsJson, implementation::LoadStringResource(IDR_DEFAULTS) }; oldLoader.MergeInboxIntoUserSettings(); oldLoader.FinalizeLayering(); oldLoader.FixupUserSettings(); @@ -638,7 +638,7 @@ namespace SettingsModelUnitTests const auto oldResult{ oldSettings->ToJson() }; Log::Comment(L"Now, create a _new_ settings object from the re-serialization of the first"); - implementation::SettingsLoader newLoader{ toString(oldResult), DefaultJson }; + implementation::SettingsLoader newLoader{ toString(oldResult), implementation::LoadStringResource(IDR_DEFAULTS) }; newLoader.MergeInboxIntoUserSettings(); newLoader.FinalizeLayering(); newLoader.FixupUserSettings(); @@ -763,14 +763,14 @@ namespace SettingsModelUnitTests ] })-" }; - implementation::SettingsLoader oldLoader{ oldSettingsJson, DefaultJson }; + implementation::SettingsLoader oldLoader{ oldSettingsJson, implementation::LoadStringResource(IDR_DEFAULTS) }; oldLoader.MergeInboxIntoUserSettings(); oldLoader.FinalizeLayering(); VERIFY_IS_TRUE(oldLoader.FixupUserSettings(), L"Validate that this will indicate we need to write them back to disk"); const auto oldSettings = winrt::make_self(std::move(oldLoader)); const auto oldResult{ oldSettings->ToJson() }; - implementation::SettingsLoader newLoader{ newSettingsJson, DefaultJson }; + implementation::SettingsLoader newLoader{ newSettingsJson, implementation::LoadStringResource(IDR_DEFAULTS) }; newLoader.MergeInboxIntoUserSettings(); newLoader.FinalizeLayering(); newLoader.FixupUserSettings(); @@ -860,14 +860,14 @@ namespace SettingsModelUnitTests ] })-" }; - implementation::SettingsLoader oldLoader{ oldSettingsJson, DefaultJson }; + implementation::SettingsLoader oldLoader{ oldSettingsJson, implementation::LoadStringResource(IDR_DEFAULTS) }; oldLoader.MergeInboxIntoUserSettings(); oldLoader.FinalizeLayering(); VERIFY_IS_TRUE(oldLoader.FixupUserSettings(), L"Validate that this will indicate we need to write them back to disk"); const auto oldSettings = winrt::make_self(std::move(oldLoader)); const auto oldResult{ oldSettings->ToJson() }; - implementation::SettingsLoader newLoader{ newSettingsJson, DefaultJson }; + implementation::SettingsLoader newLoader{ newSettingsJson, implementation::LoadStringResource(IDR_DEFAULTS) }; newLoader.MergeInboxIntoUserSettings(); newLoader.FinalizeLayering(); newLoader.FixupUserSettings(); @@ -932,14 +932,14 @@ namespace SettingsModelUnitTests "schemes": [ ] })-" }; - implementation::SettingsLoader oldLoader{ oldSettingsJson, DefaultJson }; + implementation::SettingsLoader oldLoader{ oldSettingsJson, implementation::LoadStringResource(IDR_DEFAULTS) }; oldLoader.MergeInboxIntoUserSettings(); oldLoader.FinalizeLayering(); VERIFY_IS_TRUE(oldLoader.FixupUserSettings(), L"Validate that this will indicate we need to write them back to disk"); const auto oldSettings = winrt::make_self(std::move(oldLoader)); const auto oldResult{ oldSettings->ToJson() }; - implementation::SettingsLoader newLoader{ newSettingsJson, DefaultJson }; + implementation::SettingsLoader newLoader{ newSettingsJson, implementation::LoadStringResource(IDR_DEFAULTS) }; newLoader.MergeInboxIntoUserSettings(); newLoader.FinalizeLayering(); newLoader.FixupUserSettings(); diff --git a/src/cascadia/UnitTests_SettingsModel/SettingsModel.UnitTests.vcxproj b/src/cascadia/UnitTests_SettingsModel/SettingsModel.UnitTests.vcxproj index 6210385b26..7373b872ec 100644 --- a/src/cascadia/UnitTests_SettingsModel/SettingsModel.UnitTests.vcxproj +++ b/src/cascadia/UnitTests_SettingsModel/SettingsModel.UnitTests.vcxproj @@ -77,7 +77,7 @@ 4702;%(DisableSpecificWarnings) - onecoreuap.lib;%(AdditionalDependencies) + onecoreuap.lib;%(AdditionalDependencies);$(IntDir)\..\Microsoft.Terminal.Settings.Model.lib\Microsoft.Terminal.Settings.Model.res + + + MachineX86 + + + true diff --git a/tools/CompressJson.ps1 b/tools/CompressJson.ps1 new file mode 100644 index 0000000000..a8c23426fd --- /dev/null +++ b/tools/CompressJson.ps1 @@ -0,0 +1,13 @@ +# This script is used for taking a json file and stripping the whitespace from it. + +param ( + [parameter(Mandatory = $true)] + [string]$JsonFile, + + [parameter(Mandatory = $true)] + [string]$OutPath +) + +$jsonData = Get-Content -Raw $JsonFile | ConvertFrom-Json | ConvertTo-Json -Compress -Depth 100 + +$jsonData | Out-File -FilePath $OutPath -Encoding utf8