diff --git a/src/cascadia/TerminalApp/AppLogic.cpp b/src/cascadia/TerminalApp/AppLogic.cpp index 106da0fbd..05e16d51c 100644 --- a/src/cascadia/TerminalApp/AppLogic.cpp +++ b/src/cascadia/TerminalApp/AppLogic.cpp @@ -49,6 +49,7 @@ static const std::array(SettingsLoadWar USES_RESOURCE(L"InvalidSplitSize"), USES_RESOURCE(L"FailedToParseStartupActions"), USES_RESOURCE(L"FailedToParseSubCommands"), + USES_RESOURCE(L"DidNotFindDynamicDefaultProfile"), }; static const std::array(SettingsLoadErrors::ERRORS_SIZE)> settingsLoadErrorsLabels { USES_RESOURCE(L"NoProfilesText"), @@ -488,6 +489,22 @@ namespace winrt::TerminalApp::implementation warningsTextBlock.Inlines().Append(legacyGlobalsLink); } + else if (warning == SettingsLoadWarnings::DidNotFindDynamicDefaultProfile) + { + // Add the URL here too + const auto linkLabel = RS_(L"DynamicDefaultProfileHrefLabel"); + const auto uriValue = RS_(L"DynamicDefaultProfileHrefUrl"); + + winrt::Windows::UI::Xaml::Documents::Run legacyGlobalsLinkText; + winrt::Windows::UI::Xaml::Documents::Hyperlink legacyGlobalsLink; + winrt::Windows::Foundation::Uri linkUri{ uriValue }; + + legacyGlobalsLinkText.Text(linkLabel); + legacyGlobalsLink.NavigateUri(linkUri); + legacyGlobalsLink.Inlines().Append(legacyGlobalsLinkText); + + warningsTextBlock.Inlines().Append(legacyGlobalsLink); + } warningsTextBlock.Inlines().Append(Documents::LineBreak{}); } diff --git a/src/cascadia/TerminalApp/Resources/en-US/Resources.resw b/src/cascadia/TerminalApp/Resources/en-US/Resources.resw index f9e8cbf12..a72919136 100644 --- a/src/cascadia/TerminalApp/Resources/en-US/Resources.resw +++ b/src/cascadia/TerminalApp/Resources/en-US/Resources.resw @@ -232,6 +232,18 @@ • Failed to parse all subcommands of nested command. + + • We detected your default profile is a dynamic profile that did not generate. The original source of this profile may no longer exist. + + {Locked="•"} This glyph is a bullet, used in a bulleted list. + + + https://go.microsoft.com/fwlink/?linkid=2170601 + {Locked}This is a FWLink, so it will be localized with the fwlink tool + + + For more info, see this web page. + • Found a keybinding that was missing a required parameter value. This keybinding will be ignored. {Locked="•"} This glyph is a bullet, used in a bulleted list. diff --git a/src/cascadia/TerminalSettingsModel/CascadiaSettings.cpp b/src/cascadia/TerminalSettingsModel/CascadiaSettings.cpp index f2a6c9326..4918d6a70 100644 --- a/src/cascadia/TerminalSettingsModel/CascadiaSettings.cpp +++ b/src/cascadia/TerminalSettingsModel/CascadiaSettings.cpp @@ -532,6 +532,7 @@ void CascadiaSettings::_ValidateDefaultProfileExists() if (nullDefaultProfile || defaultProfileNotInProfiles) { + // TODO! Don't add the warning if we already have a DidNotFindDynamicDefaultProfile warning. _warnings.Append(Microsoft::Terminal::Settings::Model::SettingsLoadWarnings::MissingDefaultProfile); // Use the first profile as the new default diff --git a/src/cascadia/TerminalSettingsModel/CascadiaSettingsSerialization.cpp b/src/cascadia/TerminalSettingsModel/CascadiaSettingsSerialization.cpp index 9d6e5c1f8..4b5756c33 100644 --- a/src/cascadia/TerminalSettingsModel/CascadiaSettingsSerialization.cpp +++ b/src/cascadia/TerminalSettingsModel/CascadiaSettingsSerialization.cpp @@ -942,6 +942,31 @@ void CascadiaSettings::_LayerOrCreateProfile(const Json::Value& profileJson) profile->LayerJson(profileJson); _allProfiles.Append(*profile); } + else + { + // TODO! + const auto guid = Profile::GetGuidOrGenerateForJson(profileJson); + try + { + // This might throw + if (guid == _globals->DefaultProfile()) + { + _warnings.Append(SettingsLoadWarnings::DidNotFindDynamicDefaultProfile); + } + } + catch (...) + { + // if it did, then the DefaultProfile isn't valid. It might be the name of the profile! + if (GlobalSettings().HasUnparsedDefaultProfile()) + { + const auto unparsedDefaultProfile{ GlobalSettings().UnparsedDefaultProfile() }; + if (Profile::GetNameForJson(profileJson) == unparsedDefaultProfile) + { + _warnings.Append(SettingsLoadWarnings::DidNotFindDynamicDefaultProfile); + } + } + } + } } if (profile && _userDefaultProfileSettings) diff --git a/src/cascadia/TerminalSettingsModel/Profile.cpp b/src/cascadia/TerminalSettingsModel/Profile.cpp index d90a65884..946435946 100644 --- a/src/cascadia/TerminalSettingsModel/Profile.cpp +++ b/src/cascadia/TerminalSettingsModel/Profile.cpp @@ -516,6 +516,11 @@ winrt::guid Profile::GetGuidOrGenerateForJson(const Json::Value& json) noexcept return Profile::_GenerateGuidForProfile(name, source); } +winrt::hstring Profile::GetNameForJson(const Json::Value& json) noexcept +{ + return JsonUtils::GetValueForKey(json, NameKey); +} + // Method Description: // - Create a new serialized JsonObject from an instance of this class // Arguments: diff --git a/src/cascadia/TerminalSettingsModel/Profile.h b/src/cascadia/TerminalSettingsModel/Profile.h index 155dcec4c..d4f019d2e 100644 --- a/src/cascadia/TerminalSettingsModel/Profile.h +++ b/src/cascadia/TerminalSettingsModel/Profile.h @@ -100,6 +100,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation hstring EvaluatedStartingDirectory() const; static guid GetGuidOrGenerateForJson(const Json::Value& json) noexcept; + static hstring GetNameForJson(const Json::Value& json) noexcept; Model::IAppearanceConfig DefaultAppearance(); Model::FontConfig FontInfo(); diff --git a/src/cascadia/TerminalSettingsModel/TerminalWarnings.idl b/src/cascadia/TerminalSettingsModel/TerminalWarnings.idl index 6f55c0bf7..dc8995825 100644 --- a/src/cascadia/TerminalSettingsModel/TerminalWarnings.idl +++ b/src/cascadia/TerminalSettingsModel/TerminalWarnings.idl @@ -22,6 +22,7 @@ namespace Microsoft.Terminal.Settings.Model InvalidSplitSize = 12, FailedToParseStartupActions = 13, FailedToParseSubCommands = 14, + DidNotFindDynamicDefaultProfile = 15, WARNINGS_SIZE // IMPORTANT: This MUST be the last value in this enum. It's an unused placeholder. };