diff --git a/src/cascadia/TerminalApp/ActionAndArgs.cpp b/src/cascadia/TerminalApp/ActionAndArgs.cpp index e59682f80ea..a7cf78bb8ad 100644 --- a/src/cascadia/TerminalApp/ActionAndArgs.cpp +++ b/src/cascadia/TerminalApp/ActionAndArgs.cpp @@ -33,6 +33,7 @@ static constexpr std::string_view ResizePaneKey{ "resizePane" }; static constexpr std::string_view MoveFocusKey{ "moveFocus" }; static constexpr std::string_view FindKey{ "find" }; static constexpr std::string_view ToggleFullscreenKey{ "toggleFullscreen" }; +static constexpr std::string_view RenameTabKey{ "renameTab" }; namespace winrt::TerminalApp::implementation { @@ -69,7 +70,8 @@ namespace winrt::TerminalApp::implementation { ToggleFullscreenKey, ShortcutAction::ToggleFullscreen }, { SplitPaneKey, ShortcutAction::SplitPane }, { UnboundKey, ShortcutAction::Invalid }, - { FindKey, ShortcutAction::Find } + { FindKey, ShortcutAction::Find }, + { RenameTabKey, ShortcutAction::RenameTab } }; using ParseResult = std::tuple>; @@ -97,6 +99,8 @@ namespace winrt::TerminalApp::implementation { ShortcutAction::OpenSettings, winrt::TerminalApp::implementation::OpenSettingsArgs::FromJson }, + { ShortcutAction::RenameTab, winrt::TerminalApp::implementation::RenameTabArgs::FromJson }, + { ShortcutAction::Invalid, nullptr }, }; diff --git a/src/cascadia/TerminalApp/ActionArgs.cpp b/src/cascadia/TerminalApp/ActionArgs.cpp index 939eaaf3b41..d5355099896 100644 --- a/src/cascadia/TerminalApp/ActionArgs.cpp +++ b/src/cascadia/TerminalApp/ActionArgs.cpp @@ -15,3 +15,4 @@ #include "AdjustFontSizeArgs.g.cpp" #include "SplitPaneArgs.g.cpp" #include "OpenSettingsArgs.g.cpp" +#include "RenameTabArgs.g.cpp" diff --git a/src/cascadia/TerminalApp/ActionArgs.h b/src/cascadia/TerminalApp/ActionArgs.h index 031e7ca76a9..57c3e4a66d9 100644 --- a/src/cascadia/TerminalApp/ActionArgs.h +++ b/src/cascadia/TerminalApp/ActionArgs.h @@ -15,6 +15,7 @@ #include "AdjustFontSizeArgs.g.h" #include "SplitPaneArgs.g.h" #include "OpenSettingsArgs.g.h" +#include "RenameTabArgs.g.h" #include "../../cascadia/inc/cppwinrt_utils.h" #include "Utils.h" @@ -441,6 +442,35 @@ namespace winrt::TerminalApp::implementation return { *args, {} }; } }; + + struct RenameTabArgs : public RenameTabArgsT + { + RenameTabArgs() = default; + GETSET_PROPERTY(winrt::hstring, Title, L""); + + static constexpr std::string_view TitleKey{ "title" }; + + public: + bool Equals(const IActionArgs& other) + { + auto otherAsUs = other.try_as(); + if (otherAsUs) + { + return otherAsUs->_Title == _Title; + } + return false; + }; + static FromJsonResult FromJson(const Json::Value& json) + { + // LOAD BEARING: Not using make_self here _will_ break you in the future! + auto args = winrt::make_self(); + if (auto title{ json[JsonKey(TitleKey)] }) + { + args->_Title = winrt::to_hstring(title.asString()); + } + return { *args, {} }; + } + }; } namespace winrt::TerminalApp::factory_implementation diff --git a/src/cascadia/TerminalApp/ActionArgs.idl b/src/cascadia/TerminalApp/ActionArgs.idl index 881e35eafbe..1e353f7c967 100644 --- a/src/cascadia/TerminalApp/ActionArgs.idl +++ b/src/cascadia/TerminalApp/ActionArgs.idl @@ -102,4 +102,9 @@ namespace TerminalApp { SettingsTarget Target { get; }; }; + + [default_interface] runtimeclass RenameTabArgs : IActionArgs + { + String Title { get; }; + }; } diff --git a/src/cascadia/TerminalApp/AppActionHandlers.cpp b/src/cascadia/TerminalApp/AppActionHandlers.cpp index 1343cd8b422..c679d4290dd 100644 --- a/src/cascadia/TerminalApp/AppActionHandlers.cpp +++ b/src/cascadia/TerminalApp/AppActionHandlers.cpp @@ -237,4 +237,30 @@ namespace winrt::TerminalApp::implementation ToggleFullscreen(); args.Handled(true); } + + void TerminalPage::_HandleRenameTab(const IInspectable& /*sender*/, + const TerminalApp::ActionEventArgs& args) + { + std::optional title; + + if (const auto& realArgs = args.ActionArgs().try_as()) + { + title = realArgs.Title(); + } + + auto activeTab = _GetFocusedTab(); + if (activeTab) + { + if (title.has_value()) + { + activeTab->SetTabText(title.value()); + } + else + { + activeTab->ResetTabText(); + } + } + args.Handled(true); + } + } diff --git a/src/cascadia/TerminalApp/ShortcutActionDispatch.cpp b/src/cascadia/TerminalApp/ShortcutActionDispatch.cpp index 673876af920..b9a6bae6181 100644 --- a/src/cascadia/TerminalApp/ShortcutActionDispatch.cpp +++ b/src/cascadia/TerminalApp/ShortcutActionDispatch.cpp @@ -159,6 +159,11 @@ namespace winrt::TerminalApp::implementation _ToggleFullscreenHandlers(*this, *eventArgs); break; } + case ShortcutAction::RenameTab: + { + _RenameTabHandlers(*this, *eventArgs); + break; + } default: return false; } diff --git a/src/cascadia/TerminalApp/ShortcutActionDispatch.h b/src/cascadia/TerminalApp/ShortcutActionDispatch.h index f7e7ce05d06..f1c485d65e3 100644 --- a/src/cascadia/TerminalApp/ShortcutActionDispatch.h +++ b/src/cascadia/TerminalApp/ShortcutActionDispatch.h @@ -47,6 +47,7 @@ namespace winrt::TerminalApp::implementation TYPED_EVENT(Find, TerminalApp::ShortcutActionDispatch, TerminalApp::ActionEventArgs); TYPED_EVENT(MoveFocus, TerminalApp::ShortcutActionDispatch, TerminalApp::ActionEventArgs); TYPED_EVENT(ToggleFullscreen, TerminalApp::ShortcutActionDispatch, TerminalApp::ActionEventArgs); + TYPED_EVENT(RenameTab, TerminalApp::ShortcutActionDispatch, TerminalApp::ActionEventArgs); // clang-format on private: diff --git a/src/cascadia/TerminalApp/ShortcutActionDispatch.idl b/src/cascadia/TerminalApp/ShortcutActionDispatch.idl index 0a51d6b0a3a..ea048a08d5d 100644 --- a/src/cascadia/TerminalApp/ShortcutActionDispatch.idl +++ b/src/cascadia/TerminalApp/ShortcutActionDispatch.idl @@ -35,7 +35,8 @@ namespace TerminalApp MoveFocus, Find, ToggleFullscreen, - OpenSettings + OpenSettings, + RenameTab }; [default_interface] runtimeclass ActionAndArgs { @@ -73,5 +74,7 @@ namespace TerminalApp event Windows.Foundation.TypedEventHandler Find; event Windows.Foundation.TypedEventHandler MoveFocus; event Windows.Foundation.TypedEventHandler ToggleFullscreen; + event Windows.Foundation.TypedEventHandler RenameTab; + } } diff --git a/src/cascadia/TerminalApp/Tab.cpp b/src/cascadia/TerminalApp/Tab.cpp index d2eab695f8a..2a866527ef5 100644 --- a/src/cascadia/TerminalApp/Tab.cpp +++ b/src/cascadia/TerminalApp/Tab.cpp @@ -387,6 +387,18 @@ namespace winrt::TerminalApp::implementation _activePane->Close(); } + void Tab::SetTabText(winrt::hstring title) + { + _runtimeTabText = title; + _UpdateTitle(); + } + + void Tab::ResetTabText() + { + _runtimeTabText = L""; + _UpdateTitle(); + } + // Method Description: // - Register any event handlers that we may need with the given TermControl. // This should be called on each and every TermControl that we add to the tree diff --git a/src/cascadia/TerminalApp/Tab.h b/src/cascadia/TerminalApp/Tab.h index 830fa65803a..5095311fc83 100644 --- a/src/cascadia/TerminalApp/Tab.h +++ b/src/cascadia/TerminalApp/Tab.h @@ -51,6 +51,9 @@ namespace winrt::TerminalApp::implementation void Shutdown(); void ClosePane(); + void SetTabText(winrt::hstring title); + void ResetTabText(); + std::optional GetTabColor(); WINRT_CALLBACK(Closed, winrt::Windows::Foundation::EventHandler); diff --git a/src/cascadia/TerminalApp/TerminalPage.cpp b/src/cascadia/TerminalApp/TerminalPage.cpp index aff7029a009..4d12cb4037a 100644 --- a/src/cascadia/TerminalApp/TerminalPage.cpp +++ b/src/cascadia/TerminalApp/TerminalPage.cpp @@ -755,6 +755,7 @@ namespace winrt::TerminalApp::implementation _actionDispatch->Find({ this, &TerminalPage::_HandleFind }); _actionDispatch->ResetFontSize({ this, &TerminalPage::_HandleResetFontSize }); _actionDispatch->ToggleFullscreen({ this, &TerminalPage::_HandleToggleFullscreen }); + _actionDispatch->RenameTab({ this, &TerminalPage::_HandleRenameTab }); } // Method Description: @@ -1096,6 +1097,18 @@ namespace winrt::TerminalApp::implementation return std::nullopt; } + // Method Description: + // - returns a com_ptr to the currently focused tab. This might return null, + // so make sure to check the result! + winrt::com_ptr TerminalPage::_GetFocusedTab() + { + if (auto index{ _GetFocusedTabIndex() }) + { + return _GetStrongTabImpl(*index); + } + return nullptr; + } + // Method Description: // - An async method for changing the focused tab on the UI thread. This // method will _only_ set the selected item of the TabView, which will diff --git a/src/cascadia/TerminalApp/TerminalPage.h b/src/cascadia/TerminalApp/TerminalPage.h index 3a6c55a5f29..dfb1656d8c0 100644 --- a/src/cascadia/TerminalApp/TerminalPage.h +++ b/src/cascadia/TerminalApp/TerminalPage.h @@ -129,6 +129,7 @@ namespace winrt::TerminalApp::implementation winrt::Microsoft::Terminal::TerminalControl::TermControl _GetActiveControl(); std::optional _GetFocusedTabIndex() const noexcept; + winrt::com_ptr _GetFocusedTab(); winrt::fire_and_forget _SetFocusedTabIndex(const uint32_t tabIndex); void _CloseFocusedTab(); void _CloseFocusedPane(); @@ -197,6 +198,8 @@ namespace winrt::TerminalApp::implementation void _HandleFind(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); void _HandleResetFontSize(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); void _HandleToggleFullscreen(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); + void _HandleRenameTab(const IInspectable& sender, const TerminalApp::ActionEventArgs& args); + #pragma endregion friend class TerminalAppLocalTests::TabTests;