diff --git a/src/cascadia/TerminalApp/AppLogic.cpp b/src/cascadia/TerminalApp/AppLogic.cpp index a31246a031c..fb39ebf72fd 100644 --- a/src/cascadia/TerminalApp/AppLogic.cpp +++ b/src/cascadia/TerminalApp/AppLogic.cpp @@ -597,11 +597,11 @@ namespace winrt::TerminalApp::implementation // use as a title though! // // First, check the reserved keywords: - if (parsedTarget == "new") + if (parsedTarget == NewWindow) { return winrt::make(WindowingBehaviorUseNew); } - else if (parsedTarget == "last") + else if (parsedTarget == MostRecentlyUsedWindow) { return winrt::make(WindowingBehaviorUseExisting); } diff --git a/src/cascadia/TerminalApp/TerminalPage.cpp b/src/cascadia/TerminalApp/TerminalPage.cpp index 876aad78aeb..bc55b11a88f 100644 --- a/src/cascadia/TerminalApp/TerminalPage.cpp +++ b/src/cascadia/TerminalApp/TerminalPage.cpp @@ -2114,6 +2114,11 @@ namespace winrt::TerminalApp::implementation bool TerminalPage::_MoveTab(winrt::com_ptr tab, MoveTabArgs args) { + if (!tab) + { + return false; + } + // If there was a windowId in the action, try to move it to the // specified window instead of moving it in our tab row. const auto windowId{ args.Window() }; @@ -2142,8 +2147,7 @@ namespace winrt::TerminalApp::implementation // Use the requested tab, if provided. Otherwise, use the currently // focused tab. const auto tabIndex = til::coalesce(_GetTabIndex(*tab), - _GetFocusedTabIndex(), - std::optional{ std::nullopt }); + _GetFocusedTabIndex()); if (tabIndex) { const auto currentTabIndex = tabIndex.value(); diff --git a/src/cascadia/TerminalApp/TerminalTab.cpp b/src/cascadia/TerminalApp/TerminalTab.cpp index bb9df023c8d..1b881029b56 100644 --- a/src/cascadia/TerminalApp/TerminalTab.cpp +++ b/src/cascadia/TerminalApp/TerminalTab.cpp @@ -9,6 +9,7 @@ #include "Utils.h" #include "ColorHelper.h" #include "AppLogic.h" +#include "../inc/WindowingBehavior.h" using namespace winrt; using namespace winrt::Windows::UI::Xaml; @@ -1844,10 +1845,8 @@ namespace winrt::TerminalApp::implementation void TerminalTab::_moveTabToNewWindowClicked(const winrt::Windows::Foundation::IInspectable& /* sender */, const winrt::Windows::UI::Xaml::RoutedEventArgs& /* args */) { - ActionAndArgs actionAndArgs{}; - MoveTabArgs args{ hstring{ L"new" }, MoveTabDirection::Forward }; - actionAndArgs.Action(ShortcutAction::MoveTab); - actionAndArgs.Args(args); + MoveTabArgs args{ winrt::to_hstring(NewWindow), MoveTabDirection::Forward }; + ActionAndArgs actionAndArgs{ ShortcutAction::MoveTab, args }; _dispatch.DoAction(*this, actionAndArgs); } void TerminalTab::_findClicked(const winrt::Windows::Foundation::IInspectable& /* sender */, diff --git a/src/cascadia/inc/WindowingBehavior.h b/src/cascadia/inc/WindowingBehavior.h index 348b2b51ab6..c00a33e9ce0 100644 --- a/src/cascadia/inc/WindowingBehavior.h +++ b/src/cascadia/inc/WindowingBehavior.h @@ -12,3 +12,10 @@ inline constexpr int32_t WindowingBehaviorUseName{ -4 }; inline constexpr int32_t WindowingBehaviorUseNone{ -5 }; inline constexpr std::wstring_view QuakeWindowName{ L"_quake" }; + +// Magic names for magic windowing behaviors. These are reserved names, in place +// of window names. "new" can also be used in MoveTab / MovePane actions. +// * new: to use a new window, always +// * last: use the most recent window +inline constexpr std::string_view NewWindow{ "new" }; +inline constexpr std::string_view MostRecentlyUsedWindow{ "last" };