From 9a41647ffe00d973f11478fb937221239d6ac81a Mon Sep 17 00:00:00 2001 From: Mike Griese Date: Thu, 17 Dec 2020 07:24:16 -0600 Subject: [PATCH] HOLY SHIT I GOT THE COMANDLINE TO EXECUTE IN THE CURRENT WINDOW!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --- src/cascadia/Remoting/Monarch.cpp | 15 +++++++++++++-- src/cascadia/Remoting/WindowManager.cpp | 5 ++--- src/cascadia/TerminalApp/AppActionHandlers.cpp | 2 +- src/cascadia/TerminalApp/AppLogic.cpp | 13 +++++++++++++ src/cascadia/TerminalApp/AppLogic.h | 1 + src/cascadia/TerminalApp/AppLogic.idl | 1 + src/cascadia/TerminalApp/TerminalPage.cpp | 6 +++--- src/cascadia/TerminalApp/TerminalPage.h | 3 ++- src/cascadia/WindowsTerminal/AppHost.cpp | 10 ++++++++++ src/cascadia/WindowsTerminal/AppHost.h | 3 +++ 10 files changed, 49 insertions(+), 10 deletions(-) diff --git a/src/cascadia/Remoting/Monarch.cpp b/src/cascadia/Remoting/Monarch.cpp index 9c304b951b7..af6e50e53b9 100644 --- a/src/cascadia/Remoting/Monarch.cpp +++ b/src/cascadia/Remoting/Monarch.cpp @@ -117,6 +117,10 @@ namespace winrt::Microsoft::Terminal::Remoting::implementation { auto sessionId = std::stoi({ args[2].data(), args[2].size() }); printf("Found a commandline intended for session %d\n", sessionId); + + // TODO:MG + // HACK: do an args[2:] to slice off the `-w window` args. + array_view argsNoWindow{ args.begin() + 2, args.end() }; if (sessionId < 0) { printf("That certainly isn't a valid ID, they should make a new window.\n"); @@ -127,7 +131,13 @@ namespace winrt::Microsoft::Terminal::Remoting::implementation printf("Session 0 is actually #%llu\n", _mostRecentPeasant); if (auto mruPeasant = _getPeasant(_mostRecentPeasant)) { - auto eventArgs = winrt::make_self(args, cwd); + // TODO In the morning: + // Right now, this commandline includes the "-w window" param, and CLI11 is biting it when parsing that. + // Either: + // * hack yank it for the time being (args[2:]) + // * actually have an AppCommandlineArgs do the parsing. + + auto eventArgs = winrt::make_self(argsNoWindow, cwd); mruPeasant.ExecuteCommandline(*eventArgs); createNewWindow = false; } @@ -136,7 +146,7 @@ namespace winrt::Microsoft::Terminal::Remoting::implementation { if (auto otherPeasant = _getPeasant(sessionId)) { - auto eventArgs = winrt::make_self(args, cwd); + auto eventArgs = winrt::make_self(argsNoWindow, cwd); otherPeasant.ExecuteCommandline(*eventArgs); createNewWindow = false; } @@ -163,6 +173,7 @@ namespace winrt::Microsoft::Terminal::Remoting::implementation return createNewWindow; } + void Monarch::ToggleWindowingBehavior() { switch (_windowingBehavior) diff --git a/src/cascadia/Remoting/WindowManager.cpp b/src/cascadia/Remoting/WindowManager.cpp index b5e60723bd2..5ba26eada7a 100644 --- a/src/cascadia/Remoting/WindowManager.cpp +++ b/src/cascadia/Remoting/WindowManager.cpp @@ -45,14 +45,13 @@ namespace winrt::Microsoft::Terminal::Remoting::implementation auto eventArgs = winrt::make_self(args, cwd); _peasant.ExecuteCommandline(*eventArgs); - _shouldCreateWindow = false; + _shouldCreateWindow = true; } else { // printf("The Monarch instructed us to not create a new window. We'll be exiting now.\n"); + _shouldCreateWindow = false; } - - _shouldCreateWindow = true; } bool WindowManager::ShouldCreateWindow() diff --git a/src/cascadia/TerminalApp/AppActionHandlers.cpp b/src/cascadia/TerminalApp/AppActionHandlers.cpp index f51ea8c2ae2..c7c4d028a42 100644 --- a/src/cascadia/TerminalApp/AppActionHandlers.cpp +++ b/src/cascadia/TerminalApp/AppActionHandlers.cpp @@ -453,7 +453,7 @@ namespace winrt::TerminalApp::implementation if (_startupActions.Size() != 0) { actionArgs.Handled(true); - _ProcessStartupActions(actions, false); + ProcessStartupActions(actions, false); } } } diff --git a/src/cascadia/TerminalApp/AppLogic.cpp b/src/cascadia/TerminalApp/AppLogic.cpp index f052341b53f..e581d1f987c 100644 --- a/src/cascadia/TerminalApp/AppLogic.cpp +++ b/src/cascadia/TerminalApp/AppLogic.cpp @@ -1111,6 +1111,19 @@ namespace winrt::TerminalApp::implementation return result; } + int32_t AppLogic::ExecuteCommandline(array_view args) + { + ::TerminalApp::AppCommandlineArgs appArgs; + auto result = appArgs.ParseArgs(args); + if (result == 0) + { + auto actions = winrt::single_threaded_vector(std::move(appArgs.GetStartupActions())); + _root->ProcessStartupActions(actions, false); + } + + return result; // TODO:MG does a return value make sense + } + // Method Description: // - If there were any errors parsing the commandline that was used to // initialize the terminal, this will return a string containing that diff --git a/src/cascadia/TerminalApp/AppLogic.h b/src/cascadia/TerminalApp/AppLogic.h index 3d2051a1200..1a93abcf509 100644 --- a/src/cascadia/TerminalApp/AppLogic.h +++ b/src/cascadia/TerminalApp/AppLogic.h @@ -29,6 +29,7 @@ namespace winrt::TerminalApp::implementation [[nodiscard]] Microsoft::Terminal::Settings::Model::CascadiaSettings GetSettings() const noexcept; int32_t SetStartupCommandline(array_view actions); + int32_t ExecuteCommandline(array_view actions); winrt::hstring ParseCommandlineMessage(); bool ShouldExitEarly(); diff --git a/src/cascadia/TerminalApp/AppLogic.idl b/src/cascadia/TerminalApp/AppLogic.idl index d1bc606d4b8..3abf62eb12a 100644 --- a/src/cascadia/TerminalApp/AppLogic.idl +++ b/src/cascadia/TerminalApp/AppLogic.idl @@ -29,6 +29,7 @@ namespace TerminalApp Boolean IsElevated(); Int32 SetStartupCommandline(String[] commands); + Int32 ExecuteCommandline(String[] commands); String ParseCommandlineMessage { get; }; Boolean ShouldExitEarly { get; }; diff --git a/src/cascadia/TerminalApp/TerminalPage.cpp b/src/cascadia/TerminalApp/TerminalPage.cpp index a21779e263c..adfbb3a46c1 100644 --- a/src/cascadia/TerminalApp/TerminalPage.cpp +++ b/src/cascadia/TerminalApp/TerminalPage.cpp @@ -331,7 +331,7 @@ namespace winrt::TerminalApp::implementation } else { - _ProcessStartupActions(_startupActions, true); + ProcessStartupActions(_startupActions, true); } } } @@ -347,8 +347,8 @@ namespace winrt::TerminalApp::implementation // should fire an Initialized event. // Return Value: // - - winrt::fire_and_forget TerminalPage::_ProcessStartupActions(Windows::Foundation::Collections::IVector actions, - const bool initial) + winrt::fire_and_forget TerminalPage::ProcessStartupActions(Windows::Foundation::Collections::IVector actions, + const bool initial) { // If there are no actions left, do nothing. if (actions.Size() == 0) diff --git a/src/cascadia/TerminalApp/TerminalPage.h b/src/cascadia/TerminalApp/TerminalPage.h index 3edc7ac40ed..407dd46958a 100644 --- a/src/cascadia/TerminalApp/TerminalPage.h +++ b/src/cascadia/TerminalApp/TerminalPage.h @@ -81,6 +81,8 @@ namespace winrt::TerminalApp::implementation void ShowKeyboardServiceWarning(); winrt::hstring KeyboardServiceDisabledText(); + winrt::fire_and_forget ProcessStartupActions(Windows::Foundation::Collections::IVector actions, const bool initial); + // -------------------------------- WinRT Events --------------------------------- DECLARE_EVENT_WITH_TYPED_EVENT_HANDLER(TitleChanged, _titleChangeHandlers, winrt::Windows::Foundation::IInspectable, winrt::hstring); DECLARE_EVENT_WITH_TYPED_EVENT_HANDLER(LastTabClosed, _lastTabClosedHandlers, winrt::Windows::Foundation::IInspectable, winrt::TerminalApp::LastTabClosedEventArgs); @@ -137,7 +139,6 @@ namespace winrt::TerminalApp::implementation StartupState _startupState{ StartupState::NotInitialized }; Windows::Foundation::Collections::IVector _startupActions; - winrt::fire_and_forget _ProcessStartupActions(Windows::Foundation::Collections::IVector actions, const bool initial); void _ShowAboutDialog(); winrt::Windows::Foundation::IAsyncOperation _ShowCloseWarningDialog(); diff --git a/src/cascadia/WindowsTerminal/AppHost.cpp b/src/cascadia/WindowsTerminal/AppHost.cpp index c37a74e8149..346f5d127ee 100644 --- a/src/cascadia/WindowsTerminal/AppHost.cpp +++ b/src/cascadia/WindowsTerminal/AppHost.cpp @@ -59,6 +59,10 @@ AppHost::AppHost() noexcept : { return; } + if (auto peasant{ _windowManager.CurrentWindow() }) + { + peasant.ExecuteCommandlineRequested({ this, &AppHost::_DispatchCommandline }); + } } // If there were commandline args to our process, try and process them here. @@ -542,3 +546,9 @@ bool AppHost::HasWindow() // // returns true if we should create a new window // return true; // } + +void AppHost::_DispatchCommandline(winrt::Windows::Foundation::IInspectable sender, + winrt::Microsoft::Terminal::Remoting::CommandlineArgs args) +{ + _logic.ExecuteCommandline(args.Args()); +} diff --git a/src/cascadia/WindowsTerminal/AppHost.h b/src/cascadia/WindowsTerminal/AppHost.h index e83601be6c5..22dbbc2c113 100644 --- a/src/cascadia/WindowsTerminal/AppHost.h +++ b/src/cascadia/WindowsTerminal/AppHost.h @@ -49,4 +49,7 @@ class AppHost // void _RegisterAsMonarch(); // void _CreateMonarch(); // bool _ProposeCommandlineToMonarch(); + + void _DispatchCommandline(winrt::Windows::Foundation::IInspectable sender, + winrt::Microsoft::Terminal::Remoting::CommandlineArgs args); };