From c4557594cebf786a60ab0a14ed08493302d15f5a Mon Sep 17 00:00:00 2001 From: Leonard Hecker Date: Fri, 16 Jan 2026 22:04:49 +0100 Subject: [PATCH] Use til::hstring_format wherever possible (#19733) A follow-up of #19721 which added `til::hstring_format`. --- .../LocalTests_TerminalApp/SettingsTests.cpp | 16 ++++++++-------- src/cascadia/TerminalApp/AppActionHandlers.cpp | 2 +- src/cascadia/TerminalApp/Tab.cpp | 2 +- .../TerminalApp/TerminalAppLib.vcxproj.filters | 14 +++++--------- src/cascadia/TerminalApp/TerminalWindow.cpp | 8 ++------ .../TerminalSettingsEditor/Appearances.cpp | 8 ++++---- .../ColorSchemeViewModel.cpp | 2 +- .../ColorSchemeViewModel.h | 4 ++-- .../TerminalSettingsEditor/Extensions.cpp | 6 +++--- .../TerminalSettingsEditor/LaunchViewModel.cpp | 4 ++-- .../NewTabMenuViewModel.cpp | 2 +- .../TerminalSettingsModel/ActionArgs.cpp | 6 +++--- src/cascadia/TerminalSettingsModel/ActionMap.cpp | 6 +----- .../CascadiaSettingsSerialization.cpp | 4 ++-- src/cascadia/TerminalSettingsModel/Command.cpp | 9 ++------- .../TerminalSettingsModel/DefaultTerminal.cpp | 2 +- .../TerminalSettingsModel/DefaultTerminal.h | 2 +- .../TerminalSettingsModel/SshHostGenerator.cpp | 4 ++-- src/cascadia/UIHelpers/Converters.cpp | 5 ++++- src/inc/til/winrt.h | 10 +++++++--- 20 files changed, 53 insertions(+), 63 deletions(-) diff --git a/src/cascadia/LocalTests_TerminalApp/SettingsTests.cpp b/src/cascadia/LocalTests_TerminalApp/SettingsTests.cpp index 67b6a17466..df5032ffdf 100644 --- a/src/cascadia/LocalTests_TerminalApp/SettingsTests.cpp +++ b/src/cascadia/LocalTests_TerminalApp/SettingsTests.cpp @@ -823,7 +823,7 @@ namespace TerminalAppLocalTests VERIFY_ARE_EQUAL(3u, command.NestedCommands().Size()); _logCommandNames(command.NestedCommands()); { - winrt::hstring childCommandName{ fmt::format(L"Split pane, profile: {}", name) }; + const auto childCommandName = fmt::format(FMT_COMPILE(L"Split pane, profile: {}"), name); auto childCommand = command.NestedCommands().Lookup(childCommandName); VERIFY_IS_NOT_NULL(childCommand); auto childActionAndArgs = childCommand.ActionAndArgs(); @@ -845,7 +845,7 @@ namespace TerminalAppLocalTests VERIFY_IS_FALSE(childCommand.HasNestedCommands()); } { - winrt::hstring childCommandName{ fmt::format(L"Split pane, split: down, profile: {}", name) }; + const auto childCommandName = fmt::format(FMT_COMPILE(L"Split pane, split: down, profile: {}"), name); auto childCommand = command.NestedCommands().Lookup(childCommandName); VERIFY_IS_NOT_NULL(childCommand); auto childActionAndArgs = childCommand.ActionAndArgs(); @@ -867,7 +867,7 @@ namespace TerminalAppLocalTests VERIFY_IS_FALSE(childCommand.HasNestedCommands()); } { - winrt::hstring childCommandName{ fmt::format(L"Split pane, split: right, profile: {}", name) }; + const auto childCommandName = fmt::format(FMT_COMPILE(L"Split pane, split: right, profile: {}"), name); auto childCommand = command.NestedCommands().Lookup(childCommandName); VERIFY_IS_NOT_NULL(childCommand); auto childActionAndArgs = childCommand.ActionAndArgs(); @@ -960,8 +960,8 @@ namespace TerminalAppLocalTests for (auto name : std::vector({ L"profile0", L"profile1", L"profile2" })) { - winrt::hstring commandName{ fmt::format(L"New tab, profile: {}", name) }; - auto command = rootCommand.NestedCommands().Lookup(commandName); + const auto childCommandName = fmt::format(FMT_COMPILE(L"New tab, profile: {}"), name); + auto command = rootCommand.NestedCommands().Lookup(childCommandName); VERIFY_IS_NOT_NULL(command); auto actionAndArgs = command.ActionAndArgs(); VERIFY_IS_NOT_NULL(actionAndArgs); @@ -1078,7 +1078,7 @@ namespace TerminalAppLocalTests _logCommandNames(command.NestedCommands()); { - winrt::hstring childCommandName{ fmt::format(L"Split pane, profile: {}", name) }; + const auto childCommandName = fmt::format(FMT_COMPILE(L"Split pane, profile: {}"), name); auto childCommand = command.NestedCommands().Lookup(childCommandName); VERIFY_IS_NOT_NULL(childCommand); auto childActionAndArgs = childCommand.ActionAndArgs(); @@ -1100,7 +1100,7 @@ namespace TerminalAppLocalTests VERIFY_IS_FALSE(childCommand.HasNestedCommands()); } { - winrt::hstring childCommandName{ fmt::format(L"Split pane, split: down, profile: {}", name) }; + const auto childCommandName = fmt::format(FMT_COMPILE(L"Split pane, split: down, profile: {}"), name); auto childCommand = command.NestedCommands().Lookup(childCommandName); VERIFY_IS_NOT_NULL(childCommand); auto childActionAndArgs = childCommand.ActionAndArgs(); @@ -1122,7 +1122,7 @@ namespace TerminalAppLocalTests VERIFY_IS_FALSE(childCommand.HasNestedCommands()); } { - winrt::hstring childCommandName{ fmt::format(L"Split pane, split: right, profile: {}", name) }; + const auto childCommandName = fmt::format(FMT_COMPILE(L"Split pane, split: right, profile: {}"), name); auto childCommand = command.NestedCommands().Lookup(childCommandName); VERIFY_IS_NOT_NULL(childCommand); auto childActionAndArgs = childCommand.ActionAndArgs(); diff --git a/src/cascadia/TerminalApp/AppActionHandlers.cpp b/src/cascadia/TerminalApp/AppActionHandlers.cpp index 9edcb6a81c..e81a6c1d80 100644 --- a/src/cascadia/TerminalApp/AppActionHandlers.cpp +++ b/src/cascadia/TerminalApp/AppActionHandlers.cpp @@ -914,7 +914,7 @@ namespace winrt::TerminalApp::implementation // Build the commandline to pass to wt for this set of NewTerminalArgs // `-w -1` will ensure a new window is created. const auto commandline = terminalArgs.ToCommandline(); - winrt::hstring cmdline{ fmt::format(FMT_COMPILE(L"-w -1 new-tab {}"), commandline) }; + const auto cmdline = fmt::format(FMT_COMPILE(L"-w -1 new-tab {}"), commandline); // Build the args to ShellExecuteEx. We need to use ShellExecuteEx so we // can pass the SEE_MASK_NOASYNC flag. That flag allows us to safely diff --git a/src/cascadia/TerminalApp/Tab.cpp b/src/cascadia/TerminalApp/Tab.cpp index dcbe2a28b2..976e5f2d39 100644 --- a/src/cascadia/TerminalApp/Tab.cpp +++ b/src/cascadia/TerminalApp/Tab.cpp @@ -2137,7 +2137,7 @@ namespace winrt::TerminalApp::implementation const auto profileName{ profile.Name() }; if (profileName != Title()) { - return winrt::hstring{ fmt::format(FMT_COMPILE(L"{}: {}"), profileName, Title()) }; + return til::hstring_format(FMT_COMPILE(L"{}: {}"), profileName, Title()); } } diff --git a/src/cascadia/TerminalApp/TerminalAppLib.vcxproj.filters b/src/cascadia/TerminalApp/TerminalAppLib.vcxproj.filters index e15e8c8bfb..661065d9ac 100644 --- a/src/cascadia/TerminalApp/TerminalAppLib.vcxproj.filters +++ b/src/cascadia/TerminalApp/TerminalAppLib.vcxproj.filters @@ -2,7 +2,6 @@ - @@ -33,8 +32,7 @@ - - + @@ -60,14 +58,10 @@ fzf - - fzf - - - + @@ -90,7 +84,8 @@ - + + @@ -123,6 +118,7 @@ + diff --git a/src/cascadia/TerminalApp/TerminalWindow.cpp b/src/cascadia/TerminalApp/TerminalWindow.cpp index 498ed163fb..27a573e320 100644 --- a/src/cascadia/TerminalApp/TerminalWindow.cpp +++ b/src/cascadia/TerminalApp/TerminalWindow.cpp @@ -1393,9 +1393,7 @@ namespace winrt::TerminalApp::implementation // - a string for displaying the name of the window. winrt::hstring WindowProperties::WindowIdForDisplay() const noexcept { - return winrt::hstring{ fmt::format(FMT_COMPILE(L"{}: {}"), - std::wstring_view(RS_(L"WindowIdLabel")), - _WindowId) }; + return til::hstring_format(FMT_COMPILE(L"{}: {}"), std::wstring_view(RS_(L"WindowIdLabel")), _WindowId); } // Method Description: @@ -1406,9 +1404,7 @@ namespace winrt::TerminalApp::implementation // - a string for displaying the name of the window. winrt::hstring WindowProperties::WindowNameForDisplay() const noexcept { - return _WindowName.empty() ? - winrt::hstring{ fmt::format(FMT_COMPILE(L"<{}>"), RS_(L"UnnamedWindowName")) } : - _WindowName; + return _WindowName.empty() ? til::hstring_format(FMT_COMPILE(L"<{}>"), RS_(L"UnnamedWindowName")) : _WindowName; } bool WindowProperties::IsQuakeWindow() const noexcept diff --git a/src/cascadia/TerminalSettingsEditor/Appearances.cpp b/src/cascadia/TerminalSettingsEditor/Appearances.cpp index 8d2882dfca..78f7b1570e 100644 --- a/src/cascadia/TerminalSettingsEditor/Appearances.cpp +++ b/src/cascadia/TerminalSettingsEditor/Appearances.cpp @@ -159,7 +159,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation if (HasLibraryResourceWithName(key)) { displayString = GetLibraryResourceString(key); - displayString = hstring{ fmt::format(FMT_COMPILE(L"{} ({})"), displayString, std::wstring_view{ tagString }) }; + displayString = til::hstring_format(FMT_COMPILE(L"{} ({})"), displayString, std::wstring_view{ tagString }); } } @@ -204,7 +204,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation winrt::hstring FontKeyValuePair::AutomationName() { - return hstring{ fmt::format(FMT_COMPILE(L"{}: {}"), KeyDisplayStringRef(), _value) }; + return til::hstring_format(FMT_COMPILE(L"{}: {}"), KeyDisplayStringRef(), _value); } AppearanceViewModel::AppearanceViewModel(const Model::AppearanceConfig& appearance) : @@ -515,7 +515,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation const auto idx = getLocalizedStringIndex(names.get(), localeName, 0); const auto localizedName = getLocalizedStringByIndex(names.get(), idx); const auto tagString = tagToString(tag); - hstring displayString{ fmt::format(FMT_COMPILE(L"{} ({})"), localizedName, std::wstring_view{ tagString }) }; + const auto displayString = til::hstring_format(FMT_COMPILE(L"{} ({})"), localizedName, std::wstring_view{ tagString }); const auto value = axesVector[i].value; @@ -1193,7 +1193,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation { const auto prefix = fontSpecView.substr(0, idx); const auto suffix = std::wstring_view{ fontName }; - fontSpec = winrt::hstring{ fmt::format(FMT_COMPILE(L"{}, {}"), prefix, suffix) }; + fontSpec = til::hstring_format(FMT_COMPILE(L"{}, {}"), prefix, suffix); } else { diff --git a/src/cascadia/TerminalSettingsEditor/ColorSchemeViewModel.cpp b/src/cascadia/TerminalSettingsEditor/ColorSchemeViewModel.cpp index d2f10c259e..2d90a3e25c 100644 --- a/src/cascadia/TerminalSettingsEditor/ColorSchemeViewModel.cpp +++ b/src/cascadia/TerminalSettingsEditor/ColorSchemeViewModel.cpp @@ -56,7 +56,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation { if (IsDefaultScheme()) { - return hstring{ fmt::format(FMT_COMPILE(L"{} ({})"), Name(), RS_(L"ColorScheme_DefaultTag/Text")) }; + return til::hstring_format(FMT_COMPILE(L"{} ({})"), Name(), RS_(L"ColorScheme_DefaultTag/Text")); } return Name(); } diff --git a/src/cascadia/TerminalSettingsEditor/ColorSchemeViewModel.h b/src/cascadia/TerminalSettingsEditor/ColorSchemeViewModel.h index 45d3983f9a..5574d7b6cf 100644 --- a/src/cascadia/TerminalSettingsEditor/ColorSchemeViewModel.h +++ b/src/cascadia/TerminalSettingsEditor/ColorSchemeViewModel.h @@ -66,12 +66,12 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation hstring AccessibleName() const { - return hstring{ fmt::format(FMT_COMPILE(L"{} RGB({}, {}, {})"), _Name, _Color.R, _Color.G, _Color.B) }; + return til::hstring_format(FMT_COMPILE(L"{} RGB({}, {}, {})"), _Name, _Color.R, _Color.G, _Color.B); } hstring NameWithHexCode() const { - return hstring{ fmt::format(FMT_COMPILE(L"{} #{:02X}{:02X}{:02X}"), _Name, _Color.R, _Color.G, _Color.B) }; + return til::hstring_format(FMT_COMPILE(L"{} #{:02X}{:02X}{:02X}"), _Name, _Color.R, _Color.G, _Color.B); } til::property_changed_event PropertyChanged; diff --git a/src/cascadia/TerminalSettingsEditor/Extensions.cpp b/src/cascadia/TerminalSettingsEditor/Extensions.cpp index 9557eff7ad..d12cd1244d 100644 --- a/src/cascadia/TerminalSettingsEditor/Extensions.cpp +++ b/src/cascadia/TerminalSettingsEditor/Extensions.cpp @@ -479,7 +479,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation const auto source = _package.Source(); if (const auto displayName = _package.DisplayName(); !displayName.empty()) { - return hstring{ fmt::format(FMT_COMPILE(L"{}, {}"), displayName, source) }; + return til::hstring_format(FMT_COMPILE(L"{}, {}"), displayName, source); } return source; } @@ -491,7 +491,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation hstring FragmentProfileViewModel::AccessibleName() const noexcept { - return hstring{ fmt::format(FMT_COMPILE(L"{}, {}"), Profile().Name(), SourceName()) }; + return til::hstring_format(FMT_COMPILE(L"{}, {}"), Profile().Name(), SourceName()); } bool FragmentColorSchemeViewModel::SortAscending(const Editor::FragmentColorSchemeViewModel& lhs, const Editor::FragmentColorSchemeViewModel& rhs) @@ -501,7 +501,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation hstring FragmentColorSchemeViewModel::AccessibleName() const noexcept { - return hstring{ fmt::format(FMT_COMPILE(L"{}, {}"), ColorSchemeVM().Name(), SourceName()) }; + return til::hstring_format(FMT_COMPILE(L"{}, {}"), ColorSchemeVM().Name(), SourceName()); } DataTemplate ExtensionPackageTemplateSelector::SelectTemplateCore(const IInspectable& item, const DependencyObject& /*container*/) diff --git a/src/cascadia/TerminalSettingsEditor/LaunchViewModel.cpp b/src/cascadia/TerminalSettingsEditor/LaunchViewModel.cpp index 1541ac48b7..d02acddf9c 100644 --- a/src/cascadia/TerminalSettingsEditor/LaunchViewModel.cpp +++ b/src/cascadia/TerminalSettingsEditor/LaunchViewModel.cpp @@ -203,7 +203,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation winrt::hstring LaunchViewModel::LaunchSizeCurrentValue() const { - return winrt::hstring{ fmt::format(FMT_COMPILE(L"{} × {}"), InitialCols(), InitialRows()) }; + return til::hstring_format(FMT_COMPILE(L"{} × {}"), InitialCols(), InitialRows()); } winrt::hstring LaunchViewModel::LaunchParametersCurrentValue() @@ -225,7 +225,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation } // Append the CenterOnLaunch part - result = CenterOnLaunch() ? winrt::hstring{ fmt::format(FMT_COMPILE(L"{}, {}"), result, RS_(L"Globals_CenterOnLaunchCentered")) } : result; + result = CenterOnLaunch() ? til::hstring_format(FMT_COMPILE(L"{}, {}"), result, RS_(L"Globals_CenterOnLaunchCentered")) : result; return result; } diff --git a/src/cascadia/TerminalSettingsEditor/NewTabMenuViewModel.cpp b/src/cascadia/TerminalSettingsEditor/NewTabMenuViewModel.cpp index 9f5acbd8a2..59d7427a74 100644 --- a/src/cascadia/TerminalSettingsEditor/NewTabMenuViewModel.cpp +++ b/src/cascadia/TerminalSettingsEditor/NewTabMenuViewModel.cpp @@ -555,7 +555,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation { return action.Name(); } - return hstring{ fmt::format(L"{}: {}", RS_(L"NewTabMenu_ActionNotFound"), actionID) }; + return til::hstring_format(FMT_COMPILE(L"{}: {}"), RS_(L"NewTabMenu_ActionNotFound"), actionID); } hstring ActionEntryViewModel::Icon() const diff --git a/src/cascadia/TerminalSettingsModel/ActionArgs.cpp b/src/cascadia/TerminalSettingsModel/ActionArgs.cpp index f204e7dadb..1ee2ca22af 100644 --- a/src/cascadia/TerminalSettingsModel/ActionArgs.cpp +++ b/src/cascadia/TerminalSettingsModel/ActionArgs.cpp @@ -760,7 +760,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation { return RS_switchable_(L"NewWindowCommandKey"); } - return winrt::hstring{ fmt::format(FMT_COMPILE(L"{}, {}"), RS_switchable_(L"NewWindowCommandKey"), newTerminalArgsStr) }; + return til::hstring_format(FMT_COMPILE(L"{}, {}"), RS_switchable_(L"NewWindowCommandKey"), newTerminalArgsStr); } winrt::hstring PrevTabArgs::GenerateName(const winrt::WARC::ResourceContext& context) const @@ -771,7 +771,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation } const auto mode = SwitcherMode().Value() == TabSwitcherMode::MostRecentlyUsed ? L"most recently used" : L"in order"; - return winrt::hstring(fmt::format(FMT_COMPILE(L"{}, {}"), RS_switchable_(L"PrevTabCommandKey"), mode)); + return til::hstring_format(FMT_COMPILE(L"{}, {}"), RS_switchable_(L"PrevTabCommandKey"), mode); } winrt::hstring NextTabArgs::GenerateName(const winrt::WARC::ResourceContext& context) const @@ -782,7 +782,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation } const auto mode = SwitcherMode().Value() == TabSwitcherMode::MostRecentlyUsed ? L"most recently used" : L"in order"; - return winrt::hstring(fmt::format(FMT_COMPILE(L"{}, {}"), RS_switchable_(L"NextTabCommandKey"), mode)); + return til::hstring_format(FMT_COMPILE(L"{}, {}"), RS_switchable_(L"NextTabCommandKey"), mode); } winrt::hstring RenameWindowArgs::GenerateName(const winrt::WARC::ResourceContext& context) const diff --git a/src/cascadia/TerminalSettingsModel/ActionMap.cpp b/src/cascadia/TerminalSettingsModel/ActionMap.cpp index 82f6d9ec5f..062d303c33 100644 --- a/src/cascadia/TerminalSettingsModel/ActionMap.cpp +++ b/src/cascadia/TerminalSettingsModel/ActionMap.cpp @@ -1114,11 +1114,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation const auto inArgs{ command.ActionAndArgs().Args().try_as() }; const auto inputString{ inArgs ? inArgs.Input() : L"" }; - auto args = winrt::make_self( - winrt::hstring{ fmt::format(FMT_COMPILE(L"{:\x7f^{}}{}"), - L"", - numBackspaces, - inputString) }); + auto args = winrt::make_self(til::hstring_format(FMT_COMPILE(L"{:\x7f^{}}{}"), L"", numBackspaces, inputString)); Model::ActionAndArgs actionAndArgs{ ShortcutAction::SendInput, *args }; auto copy = cmdImpl->Copy(); diff --git a/src/cascadia/TerminalSettingsModel/CascadiaSettingsSerialization.cpp b/src/cascadia/TerminalSettingsModel/CascadiaSettingsSerialization.cpp index 764ca9e321..2ac2e4c676 100644 --- a/src/cascadia/TerminalSettingsModel/CascadiaSettingsSerialization.cpp +++ b/src/cascadia/TerminalSettingsModel/CascadiaSettingsSerialization.cpp @@ -1122,11 +1122,11 @@ bool SettingsLoader::_addOrMergeUserColorScheme(const winrt::com_ptrIsEquivalentForSettingsMergePurposes(newScheme)) { - hstring newName{ fmt::format(FMT_COMPILE(L"{} (modified)"), existingScheme->Name()) }; + auto newName = til::hstring_format(FMT_COMPILE(L"{} (modified)"), existingScheme->Name()); int differentiator = 2; while (userSettings.colorSchemes.contains(newName)) { - newName = hstring{ fmt::format(FMT_COMPILE(L"{} (modified {})"), existingScheme->Name(), differentiator++) }; + newName = til::hstring_format(FMT_COMPILE(L"{} (modified {})"), existingScheme->Name(), differentiator++); } // Rename the user's scheme. existingScheme->Name(newName); diff --git a/src/cascadia/TerminalSettingsModel/Command.cpp b/src/cascadia/TerminalSettingsModel/Command.cpp index c012617a4c..83bec5d7f0 100644 --- a/src/cascadia/TerminalSettingsModel/Command.cpp +++ b/src/cascadia/TerminalSettingsModel/Command.cpp @@ -692,11 +692,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation JsonUtils::GetValueForKey(element, "ListItemText", listText); JsonUtils::GetValueForKey(element, "ToolTip", tooltipText); - auto args = winrt::make_self( - winrt::hstring{ fmt::format(FMT_COMPILE(L"{:\x7f^{}}{}"), - L"", - replaceLength, - completionText) }); + auto args = winrt::make_self(til::hstring_format(FMT_COMPILE(L"{:\x7f^{}}{}"), L"", replaceLength, completionText)); Model::ActionAndArgs actionAndArgs{ ShortcutAction::SendInput, *args }; @@ -799,8 +795,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation { continue; } - auto args = winrt::make_self( - winrt::hstring{ fmt::format(FMT_COMPILE(L"{}{}{}"), cdText, backspaces, line) }); + auto args = winrt::make_self(til::hstring_format(FMT_COMPILE(L"{}{}{}"), cdText, backspaces, line)); Model::ActionAndArgs actionAndArgs{ ShortcutAction::SendInput, *args }; diff --git a/src/cascadia/TerminalSettingsModel/DefaultTerminal.cpp b/src/cascadia/TerminalSettingsModel/DefaultTerminal.cpp index 1c4550091e..1605ea0547 100644 --- a/src/cascadia/TerminalSettingsModel/DefaultTerminal.cpp +++ b/src/cascadia/TerminalSettingsModel/DefaultTerminal.cpp @@ -35,7 +35,7 @@ winrt::hstring DefaultTerminal::Version() const return winrt::hstring{}; } - return winrt::hstring{ fmt::format(FMT_COMPILE(L"{}.{}.{}.{}"), version.major, version.minor, version.build, version.revision) }; + return til::hstring_format(FMT_COMPILE(L"{}.{}.{}.{}"), version.major, version.minor, version.build, version.revision); } winrt::hstring DefaultTerminal::Author() const diff --git a/src/cascadia/TerminalSettingsModel/DefaultTerminal.h b/src/cascadia/TerminalSettingsModel/DefaultTerminal.h index 6aabae137d..52c7d0c23b 100644 --- a/src/cascadia/TerminalSettingsModel/DefaultTerminal.h +++ b/src/cascadia/TerminalSettingsModel/DefaultTerminal.h @@ -30,7 +30,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation hstring ToString() { - return hstring{ fmt::format(FMT_COMPILE(L"{}, {}, {}"), Name(), Author(), Version()) }; + return til::hstring_format(FMT_COMPILE(L"{}, {}, {}"), Name(), Author(), Version()); } hstring Name() const; diff --git a/src/cascadia/TerminalSettingsModel/SshHostGenerator.cpp b/src/cascadia/TerminalSettingsModel/SshHostGenerator.cpp index 0f9a5982f3..e7d21a44f9 100644 --- a/src/cascadia/TerminalSettingsModel/SshHostGenerator.cpp +++ b/src/cascadia/TerminalSettingsModel/SshHostGenerator.cpp @@ -36,12 +36,12 @@ using namespace winrt::Microsoft::Terminal::Settings::Model; winrt::hstring _getProfileName(const std::wstring_view& hostName) noexcept { - return winrt::hstring{ fmt::format(FMT_COMPILE(L"{0}{1}"), PROFILE_TITLE_PREFIX, hostName) }; + return til::hstring_format(FMT_COMPILE(L"{0}{1}"), PROFILE_TITLE_PREFIX, hostName); } winrt::hstring _getProfileCommandLine(const std::wstring_view& sshExePath, const std::wstring_view& hostName) noexcept { - return winrt::hstring{ fmt::format(FMT_COMPILE(LR"("{0}" {1})"), sshExePath, hostName) }; + return til::hstring_format(FMT_COMPILE(LR"("{0}" {1})"), sshExePath, hostName); } /*static*/ bool SshHostGenerator::_tryFindSshExePath(std::wstring& sshExePath) noexcept diff --git a/src/cascadia/UIHelpers/Converters.cpp b/src/cascadia/UIHelpers/Converters.cpp index 8c0cffb8af..e626c2b9e1 100644 --- a/src/cascadia/UIHelpers/Converters.cpp +++ b/src/cascadia/UIHelpers/Converters.cpp @@ -1,5 +1,8 @@ #include "pch.h" #include "Converters.h" + +#include + #include "Converters.g.cpp" #pragma warning(disable : 26497) // We will make these functions constexpr, as they are part of an ABI boundary. @@ -31,7 +34,7 @@ namespace winrt::Microsoft::Terminal::UI::implementation winrt::hstring Converters::PercentageToPercentageString(double value) { - return winrt::hstring{ fmt::format(FMT_COMPILE(L"{:.0f}%"), value * 100.0) }; + return til::hstring_format(FMT_COMPILE(L"{:.0f}%"), value * 100.0); } // Strings diff --git a/src/inc/til/winrt.h b/src/inc/til/winrt.h index a7392b9660..b199f753e2 100644 --- a/src/inc/til/winrt.h +++ b/src/inc/til/winrt.h @@ -121,14 +121,18 @@ namespace til // Terminal Implementation Library. Also: "Today I Learned" }; // fmt::format but for HSTRING. - template - winrt::hstring hstring_format(Args&&... args) + // + // NOTE: This will fail to compile if you pass a string literal as the first argument (the format argument). + // This is because std::forwarding literals turns them from constant expressions into regular ones. + // It can be fixed by giving the first argument an explicit type. I intentionally didn't do that + // because if you pass a string literal, you really ought to pass a FMT_COMPILE() instead. + winrt::hstring hstring_format(auto&&... args) { // We could use fmt::formatted_size and winrt::impl::hstring_builder here, // and this would make formatting of large strings a bit faster, and a bit slower // for short strings. More importantly, I hit compilation issues so I dropped that. fmt::basic_memory_buffer buf; - fmt::format_to(std::back_inserter(buf), args...); + fmt::format_to(std::back_inserter(buf), std::forward(args)...); return winrt::hstring{ buf.data(), gsl::narrow(buf.size()) }; } }