From aece58f23f0dce4fc17868aea0827a7f05ff3673 Mon Sep 17 00:00:00 2001 From: htcfreek <61519853+htcfreek@users.noreply.github.com> Date: Mon, 25 Dec 2023 12:23:19 +0100 Subject: [PATCH 01/15] first changes --- src/cascadia/TerminalApp/AppCommandlineArgs.cpp | 2 ++ src/cascadia/TerminalApp/AppCommandlineArgs.h | 3 +++ src/cascadia/TerminalApp/Resources/en-US/Resources.resw | 5 ++++- src/cascadia/TerminalSettingsModel/ActionArgs.h | 7 +++++++ src/cascadia/TerminalSettingsModel/ActionArgs.idl | 1 + src/cascadia/TerminalSettingsModel/TerminalSettings.cpp | 7 +++++++ 6 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/cascadia/TerminalApp/AppCommandlineArgs.cpp b/src/cascadia/TerminalApp/AppCommandlineArgs.cpp index 5060b4ff2f7..afe8be73315 100644 --- a/src/cascadia/TerminalApp/AppCommandlineArgs.cpp +++ b/src/cascadia/TerminalApp/AppCommandlineArgs.cpp @@ -576,6 +576,8 @@ void AppCommandlineArgs::_addNewTerminalArgs(AppCommandlineArgs::NewTerminalSubc _inheritEnvironment, RS_A(L"CmdInheritEnvDesc")); + subcommand.keepWindowOpenOption = subcommand.subcommand->add_flag("--ko,--keepWindowOpen", _keepWindowOpenOption, RS_A(L"CmdKeepWindowOpenDesc")); + // Using positionals_at_end allows us to support "wt new-tab -d wsl -d Ubuntu" // without CLI11 thinking that we've specified -d twice. // There's an alternate construction where we make all subcommands "prefix commands", diff --git a/src/cascadia/TerminalApp/AppCommandlineArgs.h b/src/cascadia/TerminalApp/AppCommandlineArgs.h index 9145697f453..86657804a58 100644 --- a/src/cascadia/TerminalApp/AppCommandlineArgs.h +++ b/src/cascadia/TerminalApp/AppCommandlineArgs.h @@ -69,6 +69,7 @@ class TerminalApp::AppCommandlineArgs final CLI::Option* colorSchemeOption; CLI::Option* appendCommandLineOption; CLI::Option* inheritEnvOption; + CLI::Option* keepWindowOpenOption; }; struct NewPaneSubcommand : public NewTerminalSubcommand @@ -110,6 +111,8 @@ class TerminalApp::AppCommandlineArgs final std::vector _commandline; bool _appendCommandLineOption{ false }; + bool _keepWindowOpenOption{ false }; + bool _splitVertical{ false }; bool _splitHorizontal{ false }; bool _splitDuplicate{ false }; diff --git a/src/cascadia/TerminalApp/Resources/en-US/Resources.resw b/src/cascadia/TerminalApp/Resources/en-US/Resources.resw index 3ad4bdb73b8..1af42a3d482 100644 --- a/src/cascadia/TerminalApp/Resources/en-US/Resources.resw +++ b/src/cascadia/TerminalApp/Resources/en-US/Resources.resw @@ -905,4 +905,7 @@ Restart the active pane connection - + + If set, the window will stay open after the command has exitted. (It is he same as setting the profile termination behavior to never.) + + \ No newline at end of file diff --git a/src/cascadia/TerminalSettingsModel/ActionArgs.h b/src/cascadia/TerminalSettingsModel/ActionArgs.h index 6d83964cbbc..d04c6e8b0f9 100644 --- a/src/cascadia/TerminalSettingsModel/ActionArgs.h +++ b/src/cascadia/TerminalSettingsModel/ActionArgs.h @@ -314,6 +314,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation ACTION_ARG(winrt::hstring, ColorScheme); ACTION_ARG(Windows::Foundation::IReference, Elevate, nullptr); ACTION_ARG(Windows::Foundation::IReference, ReloadEnvironmentVariables, nullptr); + ACTION_ARG(bool, KeepWindowOpen, false) ACTION_ARG(uint64_t, ContentId); static constexpr std::string_view CommandlineKey{ "commandline" }; @@ -327,6 +328,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation static constexpr std::string_view ColorSchemeKey{ "colorScheme" }; static constexpr std::string_view ElevateKey{ "elevate" }; static constexpr std::string_view ReloadEnvironmentVariablesKey{ "reloadEnvironmentVariables" }; + static constexpr std::string_view KeepWindowOpenKey{ "keepWindowOpen" }; static constexpr std::string_view ContentKey{ "__content" }; public: @@ -349,6 +351,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation otherAsUs->_ColorScheme == _ColorScheme && otherAsUs->_Elevate == _Elevate && otherAsUs->_ReloadEnvironmentVariables == _ReloadEnvironmentVariables && + otherAsUs->_KeepWindowOpen == _KeepWindowOpen && otherAsUs->_ContentId == _ContentId; } return false; @@ -367,6 +370,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation JsonUtils::GetValueForKey(json, ColorSchemeKey, args->_ColorScheme); JsonUtils::GetValueForKey(json, ElevateKey, args->_Elevate); JsonUtils::GetValueForKey(json, ReloadEnvironmentVariablesKey, args->_ReloadEnvironmentVariables); + JsonUtils::GetValueForKey(json, KeepWindowOpenKey, args->_KeepWindowOpen); JsonUtils::GetValueForKey(json, ContentKey, args->_ContentId); return *args; } @@ -388,6 +392,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation JsonUtils::SetValueForKey(json, ColorSchemeKey, args->_ColorScheme); JsonUtils::SetValueForKey(json, ElevateKey, args->_Elevate); JsonUtils::SetValueForKey(json, ReloadEnvironmentVariablesKey, args->_ReloadEnvironmentVariables); + JsonUtils::SetValueForKey(json, KeepWindowOpenKey, args->_KeepWindowOpen); JsonUtils::SetValueForKey(json, ContentKey, args->_ContentId); return json; } @@ -404,6 +409,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation copy->_ColorScheme = _ColorScheme; copy->_Elevate = _Elevate; copy->_ReloadEnvironmentVariables = _ReloadEnvironmentVariables; + copy->_KeepWindowOpen = _KeepWindowOpen; copy->_ContentId = _ContentId; return *copy; } @@ -425,6 +431,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation h.write(ColorScheme()); h.write(Elevate()); h.write(ReloadEnvironmentVariables()); + h.write(KeepWindowOpen()); h.write(ContentId()); } }; diff --git a/src/cascadia/TerminalSettingsModel/ActionArgs.idl b/src/cascadia/TerminalSettingsModel/ActionArgs.idl index 32f9005fdee..a9cefff5157 100644 --- a/src/cascadia/TerminalSettingsModel/ActionArgs.idl +++ b/src/cascadia/TerminalSettingsModel/ActionArgs.idl @@ -133,6 +133,7 @@ namespace Microsoft.Terminal.Settings.Model Windows.Foundation.IReference TabColor; String Profile; // Either a GUID or a profile's name if the GUID isn't a match Boolean AppendCommandLine; + Boolean KeepWindowOpen; // We use IReference<> to treat some args as nullable where null means // "use the inherited value". See ProfileIndex, diff --git a/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp b/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp index 617692691ee..6ee76407799 100644 --- a/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp +++ b/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp @@ -190,6 +190,11 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation { defaultSettings.ReloadEnvironmentVariables(newTerminalArgs.ReloadEnvironmentVariables().Value()); } + + if (newTerminalArgs.KeepWindowOpen()) + { + defaultSettings. + } } return settingsPair; @@ -341,6 +346,8 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation _RepositionCursorWithMouse = profile.RepositionCursorWithMouse(); _ReloadEnvironmentVariables = profile.ReloadEnvironmentVariables(); + + _CloseOnExit = profile.CloseOnExit(); } // Method Description: From 8c2490efe77c3c77b13baa4701d953d79d8cf6d7 Mon Sep 17 00:00:00 2001 From: htcfreek <61519853+htcfreek@users.noreply.github.com> Date: Mon, 25 Dec 2023 13:06:08 +0100 Subject: [PATCH 02/15] revert small change --- src/cascadia/TerminalSettingsModel/TerminalSettings.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp b/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp index 6ee76407799..ff9b7dbfff1 100644 --- a/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp +++ b/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp @@ -346,8 +346,6 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation _RepositionCursorWithMouse = profile.RepositionCursorWithMouse(); _ReloadEnvironmentVariables = profile.ReloadEnvironmentVariables(); - - _CloseOnExit = profile.CloseOnExit(); } // Method Description: From ba5564b0018b1d4c242f30c5c9e8e18c59cf9ba6 Mon Sep 17 00:00:00 2001 From: htcfreek <61519853+htcfreek@users.noreply.github.com> Date: Mon, 25 Dec 2023 14:09:24 +0100 Subject: [PATCH 03/15] try to fix problems --- src/cascadia/TerminalSettingsModel/TerminalSettings.cpp | 4 +++- src/cascadia/TerminalSettingsModel/TerminalSettings.h | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp b/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp index ff9b7dbfff1..dfe10b1a968 100644 --- a/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp +++ b/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp @@ -193,7 +193,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation if (newTerminalArgs.KeepWindowOpen()) { - defaultSettings. + defaultSettings.CloseOnExit = CloseOnExitMode::Never; } } @@ -346,6 +346,8 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation _RepositionCursorWithMouse = profile.RepositionCursorWithMouse(); _ReloadEnvironmentVariables = profile.ReloadEnvironmentVariables(); + + _CloseOnExit = profile.CloseOnExit(); } // Method Description: diff --git a/src/cascadia/TerminalSettingsModel/TerminalSettings.h b/src/cascadia/TerminalSettingsModel/TerminalSettings.h index abc210b9d94..8f9c4da168b 100644 --- a/src/cascadia/TerminalSettingsModel/TerminalSettings.h +++ b/src/cascadia/TerminalSettingsModel/TerminalSettings.h @@ -169,6 +169,8 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation INHERITABLE_SETTING(Model::TerminalSettings, bool, ReloadEnvironmentVariables, true); + INHERITABLE_SETTING(Model::TerminalSettings, CloseOnExitMode, CloseOnExit, CloseOnExitMode::Automatic); + private: std::optional> _ColorTable; std::span _getColorTableImpl(); From fb530c5e3369aae5d6d4072cd9b1c5424296cdc6 Mon Sep 17 00:00:00 2001 From: htcfreek <61519853+htcfreek@users.noreply.github.com> Date: Mon, 25 Dec 2023 14:48:23 +0100 Subject: [PATCH 04/15] comment not working code --- src/cascadia/TerminalSettingsModel/TerminalSettings.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp b/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp index dfe10b1a968..062174d673f 100644 --- a/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp +++ b/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp @@ -193,7 +193,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation if (newTerminalArgs.KeepWindowOpen()) { - defaultSettings.CloseOnExit = CloseOnExitMode::Never; + // defaultSettings.CloseOnExit = CloseOnExitMode::Never; } } From 9d6078a4a8effc2759cdbd7ae7f1a5a431f74bc2 Mon Sep 17 00:00:00 2001 From: htcfreek <61519853+htcfreek@users.noreply.github.com> Date: Mon, 25 Dec 2023 15:02:00 +0100 Subject: [PATCH 05/15] rename argument --- src/cascadia/TerminalApp/AppCommandlineArgs.cpp | 2 +- src/cascadia/TerminalApp/AppCommandlineArgs.h | 4 ++-- .../TerminalApp/Resources/en-US/Resources.resw | 6 +++--- src/cascadia/TerminalSettingsModel/ActionArgs.h | 14 +++++++------- src/cascadia/TerminalSettingsModel/ActionArgs.idl | 2 +- .../TerminalSettingsModel/TerminalSettings.cpp | 2 +- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/cascadia/TerminalApp/AppCommandlineArgs.cpp b/src/cascadia/TerminalApp/AppCommandlineArgs.cpp index afe8be73315..478b8694b87 100644 --- a/src/cascadia/TerminalApp/AppCommandlineArgs.cpp +++ b/src/cascadia/TerminalApp/AppCommandlineArgs.cpp @@ -576,7 +576,7 @@ void AppCommandlineArgs::_addNewTerminalArgs(AppCommandlineArgs::NewTerminalSubc _inheritEnvironment, RS_A(L"CmdInheritEnvDesc")); - subcommand.keepWindowOpenOption = subcommand.subcommand->add_flag("--ko,--keepWindowOpen", _keepWindowOpenOption, RS_A(L"CmdKeepWindowOpenDesc")); + subcommand.keepOpenOption = subcommand.subcommand->add_flag("--ko,--keepOpen", _keepOpenOption, RS_A(L"CmdKeepOpenDesc")); // Using positionals_at_end allows us to support "wt new-tab -d wsl -d Ubuntu" // without CLI11 thinking that we've specified -d twice. diff --git a/src/cascadia/TerminalApp/AppCommandlineArgs.h b/src/cascadia/TerminalApp/AppCommandlineArgs.h index 86657804a58..7d2b6f913ce 100644 --- a/src/cascadia/TerminalApp/AppCommandlineArgs.h +++ b/src/cascadia/TerminalApp/AppCommandlineArgs.h @@ -69,7 +69,7 @@ class TerminalApp::AppCommandlineArgs final CLI::Option* colorSchemeOption; CLI::Option* appendCommandLineOption; CLI::Option* inheritEnvOption; - CLI::Option* keepWindowOpenOption; + CLI::Option* keepOpenOption; }; struct NewPaneSubcommand : public NewTerminalSubcommand @@ -111,7 +111,7 @@ class TerminalApp::AppCommandlineArgs final std::vector _commandline; bool _appendCommandLineOption{ false }; - bool _keepWindowOpenOption{ false }; + bool _keepOpenOption{ false }; bool _splitVertical{ false }; bool _splitHorizontal{ false }; diff --git a/src/cascadia/TerminalApp/Resources/en-US/Resources.resw b/src/cascadia/TerminalApp/Resources/en-US/Resources.resw index 1af42a3d482..81f00bd54db 100644 --- a/src/cascadia/TerminalApp/Resources/en-US/Resources.resw +++ b/src/cascadia/TerminalApp/Resources/en-US/Resources.resw @@ -905,7 +905,7 @@ Restart the active pane connection - - If set, the window will stay open after the command has exitted. (It is he same as setting the profile termination behavior to never.) + + If set, the window/tab/pane will stay open after the command has exitted. (It is he same as setting the profile termination behavior to never.) - \ No newline at end of file + diff --git a/src/cascadia/TerminalSettingsModel/ActionArgs.h b/src/cascadia/TerminalSettingsModel/ActionArgs.h index d04c6e8b0f9..6944da6772a 100644 --- a/src/cascadia/TerminalSettingsModel/ActionArgs.h +++ b/src/cascadia/TerminalSettingsModel/ActionArgs.h @@ -314,7 +314,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation ACTION_ARG(winrt::hstring, ColorScheme); ACTION_ARG(Windows::Foundation::IReference, Elevate, nullptr); ACTION_ARG(Windows::Foundation::IReference, ReloadEnvironmentVariables, nullptr); - ACTION_ARG(bool, KeepWindowOpen, false) + ACTION_ARG(bool, KeepOpen, false) ACTION_ARG(uint64_t, ContentId); static constexpr std::string_view CommandlineKey{ "commandline" }; @@ -328,7 +328,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation static constexpr std::string_view ColorSchemeKey{ "colorScheme" }; static constexpr std::string_view ElevateKey{ "elevate" }; static constexpr std::string_view ReloadEnvironmentVariablesKey{ "reloadEnvironmentVariables" }; - static constexpr std::string_view KeepWindowOpenKey{ "keepWindowOpen" }; + static constexpr std::string_view KeepOpenKey{ "keepOpen" }; static constexpr std::string_view ContentKey{ "__content" }; public: @@ -351,7 +351,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation otherAsUs->_ColorScheme == _ColorScheme && otherAsUs->_Elevate == _Elevate && otherAsUs->_ReloadEnvironmentVariables == _ReloadEnvironmentVariables && - otherAsUs->_KeepWindowOpen == _KeepWindowOpen && + otherAsUs->_KeepOpen == _KeepOpen && otherAsUs->_ContentId == _ContentId; } return false; @@ -370,7 +370,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation JsonUtils::GetValueForKey(json, ColorSchemeKey, args->_ColorScheme); JsonUtils::GetValueForKey(json, ElevateKey, args->_Elevate); JsonUtils::GetValueForKey(json, ReloadEnvironmentVariablesKey, args->_ReloadEnvironmentVariables); - JsonUtils::GetValueForKey(json, KeepWindowOpenKey, args->_KeepWindowOpen); + JsonUtils::GetValueForKey(json, KeepOpenKey, args->_KeepOpen); JsonUtils::GetValueForKey(json, ContentKey, args->_ContentId); return *args; } @@ -392,7 +392,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation JsonUtils::SetValueForKey(json, ColorSchemeKey, args->_ColorScheme); JsonUtils::SetValueForKey(json, ElevateKey, args->_Elevate); JsonUtils::SetValueForKey(json, ReloadEnvironmentVariablesKey, args->_ReloadEnvironmentVariables); - JsonUtils::SetValueForKey(json, KeepWindowOpenKey, args->_KeepWindowOpen); + JsonUtils::SetValueForKey(json, KeepOpenKey, args->_KeepOpen); JsonUtils::SetValueForKey(json, ContentKey, args->_ContentId); return json; } @@ -409,7 +409,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation copy->_ColorScheme = _ColorScheme; copy->_Elevate = _Elevate; copy->_ReloadEnvironmentVariables = _ReloadEnvironmentVariables; - copy->_KeepWindowOpen = _KeepWindowOpen; + copy->_KeepOpen = _KeepOpen; copy->_ContentId = _ContentId; return *copy; } @@ -431,7 +431,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation h.write(ColorScheme()); h.write(Elevate()); h.write(ReloadEnvironmentVariables()); - h.write(KeepWindowOpen()); + h.write(KeepOpen()); h.write(ContentId()); } }; diff --git a/src/cascadia/TerminalSettingsModel/ActionArgs.idl b/src/cascadia/TerminalSettingsModel/ActionArgs.idl index a9cefff5157..dfda9d34101 100644 --- a/src/cascadia/TerminalSettingsModel/ActionArgs.idl +++ b/src/cascadia/TerminalSettingsModel/ActionArgs.idl @@ -133,7 +133,7 @@ namespace Microsoft.Terminal.Settings.Model Windows.Foundation.IReference TabColor; String Profile; // Either a GUID or a profile's name if the GUID isn't a match Boolean AppendCommandLine; - Boolean KeepWindowOpen; + Boolean KeepOpen; // We use IReference<> to treat some args as nullable where null means // "use the inherited value". See ProfileIndex, diff --git a/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp b/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp index 062174d673f..7277e1b01d2 100644 --- a/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp +++ b/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp @@ -191,7 +191,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation defaultSettings.ReloadEnvironmentVariables(newTerminalArgs.ReloadEnvironmentVariables().Value()); } - if (newTerminalArgs.KeepWindowOpen()) + if (newTerminalArgs.KeepOpen()) { // defaultSettings.CloseOnExit = CloseOnExitMode::Never; } From 26213225f324beec8a9b2a4dcd05279856368d72 Mon Sep 17 00:00:00 2001 From: htcfreek <61519853+htcfreek@users.noreply.github.com> Date: Mon, 25 Dec 2023 15:08:39 +0100 Subject: [PATCH 06/15] spell fix --- src/cascadia/TerminalApp/Resources/en-US/Resources.resw | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cascadia/TerminalApp/Resources/en-US/Resources.resw b/src/cascadia/TerminalApp/Resources/en-US/Resources.resw index 81f00bd54db..2c7a9728c78 100644 --- a/src/cascadia/TerminalApp/Resources/en-US/Resources.resw +++ b/src/cascadia/TerminalApp/Resources/en-US/Resources.resw @@ -906,6 +906,6 @@ Restart the active pane connection - If set, the window/tab/pane will stay open after the command has exitted. (It is he same as setting the profile termination behavior to never.) + If set, the window/tab/pane will stay open after the command has exited. (It is he same as setting the profile termination behavior to never.) From 6fe6d218436e7bdec7e265962058fa47517493b5 Mon Sep 17 00:00:00 2001 From: htcfreek <61519853+htcfreek@users.noreply.github.com> Date: Mon, 25 Dec 2023 17:11:22 +0100 Subject: [PATCH 07/15] fix small typo --- src/cascadia/TerminalApp/AppCommandlineArgs.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cascadia/TerminalApp/AppCommandlineArgs.cpp b/src/cascadia/TerminalApp/AppCommandlineArgs.cpp index 478b8694b87..5e60ec53d70 100644 --- a/src/cascadia/TerminalApp/AppCommandlineArgs.cpp +++ b/src/cascadia/TerminalApp/AppCommandlineArgs.cpp @@ -576,7 +576,7 @@ void AppCommandlineArgs::_addNewTerminalArgs(AppCommandlineArgs::NewTerminalSubc _inheritEnvironment, RS_A(L"CmdInheritEnvDesc")); - subcommand.keepOpenOption = subcommand.subcommand->add_flag("--ko,--keepOpen", _keepOpenOption, RS_A(L"CmdKeepOpenDesc")); + subcommand.keepOpenOption = subcommand.subcommand->add_flag("-ko,--keepOpen", _keepOpenOption, RS_A(L"CmdKeepOpenDesc")); // Using positionals_at_end allows us to support "wt new-tab -d wsl -d Ubuntu" // without CLI11 thinking that we've specified -d twice. From ee975008953f8687006593d5ec10c0cd8d5356df Mon Sep 17 00:00:00 2001 From: htcfreek <61519853+htcfreek@users.noreply.github.com> Date: Mon, 25 Dec 2023 17:34:40 +0100 Subject: [PATCH 08/15] fixes --- src/cascadia/TerminalApp/AppCommandlineArgs.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/cascadia/TerminalApp/AppCommandlineArgs.cpp b/src/cascadia/TerminalApp/AppCommandlineArgs.cpp index 5e60ec53d70..e1b7ff0fff0 100644 --- a/src/cascadia/TerminalApp/AppCommandlineArgs.cpp +++ b/src/cascadia/TerminalApp/AppCommandlineArgs.cpp @@ -677,6 +677,11 @@ NewTerminalArgs AppCommandlineArgs::_getNewTerminalArgs(AppCommandlineArgs::NewT } args.ReloadEnvironmentVariables(!inheritEnv); + if (*subcommand.keepOpenOption) + { + args.KeepOpen(_keepOpenOption); + } + return args; } @@ -722,6 +727,7 @@ void AppCommandlineArgs::_resetStateToDefault() _commandline.clear(); _suppressApplicationTitle = false; _appendCommandLineOption = false; + _keepOpenOption = false; _splitVertical = false; _splitHorizontal = false; From 21d0fc322b197c2b9826fc61fd1d6b6902a2e83e Mon Sep 17 00:00:00 2001 From: htcfreek <61519853+htcfreek@users.noreply.github.com> Date: Sun, 31 Dec 2023 12:41:47 +0100 Subject: [PATCH 09/15] fix TerminalSettings --- src/cascadia/TerminalSettingsModel/TerminalSettings.cpp | 2 +- src/cascadia/TerminalSettingsModel/TerminalSettings.idl | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp b/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp index 7277e1b01d2..5131a3498c9 100644 --- a/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp +++ b/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp @@ -193,7 +193,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation if (newTerminalArgs.KeepOpen()) { - // defaultSettings.CloseOnExit = CloseOnExitMode::Never; + defaultSettings.CloseOnExit(CloseOnExitMode::Never); } } diff --git a/src/cascadia/TerminalSettingsModel/TerminalSettings.idl b/src/cascadia/TerminalSettingsModel/TerminalSettings.idl index 23c305ee4e0..4f9b70abe96 100644 --- a/src/cascadia/TerminalSettingsModel/TerminalSettings.idl +++ b/src/cascadia/TerminalSettingsModel/TerminalSettings.idl @@ -46,5 +46,6 @@ namespace Microsoft.Terminal.Settings.Model Boolean Elevate; Boolean ReloadEnvironmentVariables; + CloseOnExitMode CloseOnExit; }; } From a25eef074b1dcc16aad05cbf2aacbc85dc50a55c Mon Sep 17 00:00:00 2001 From: htcfreek <61519853+htcfreek@users.noreply.github.com> Date: Sun, 31 Dec 2023 13:16:22 +0100 Subject: [PATCH 10/15] fix crash --- src/cascadia/TerminalApp/AppCommandlineArgs.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cascadia/TerminalApp/AppCommandlineArgs.cpp b/src/cascadia/TerminalApp/AppCommandlineArgs.cpp index e1b7ff0fff0..a3f158c7d1f 100644 --- a/src/cascadia/TerminalApp/AppCommandlineArgs.cpp +++ b/src/cascadia/TerminalApp/AppCommandlineArgs.cpp @@ -576,7 +576,7 @@ void AppCommandlineArgs::_addNewTerminalArgs(AppCommandlineArgs::NewTerminalSubc _inheritEnvironment, RS_A(L"CmdInheritEnvDesc")); - subcommand.keepOpenOption = subcommand.subcommand->add_flag("-ko,--keepOpen", _keepOpenOption, RS_A(L"CmdKeepOpenDesc")); + subcommand.keepOpenOption = subcommand.subcommand->add_flag("-o,--keepOpen", _keepOpenOption, RS_A(L"CmdKeepOpenDesc")); // Using positionals_at_end allows us to support "wt new-tab -d wsl -d Ubuntu" // without CLI11 thinking that we've specified -d twice. From e7305113aed5afb330d0ac5056ea640041c17d58 Mon Sep 17 00:00:00 2001 From: htcfreek <61519853+htcfreek@users.noreply.github.com> Date: Mon, 24 Jun 2024 15:30:27 +0200 Subject: [PATCH 11/15] update json schema --- doc/cascadia/profiles.schema.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/cascadia/profiles.schema.json b/doc/cascadia/profiles.schema.json index 8ab581594e0..89f27a1d77e 100644 --- a/doc/cascadia/profiles.schema.json +++ b/doc/cascadia/profiles.schema.json @@ -618,6 +618,11 @@ "type": "boolean", "default": false, "description": "This will override the profile's `elevate` setting." + }, + "keepOpen": { + "type": "boolean", + "default": false, + "description": "This will override the profile's `closeOnExit` setting to keep the tab/pane/window open." } }, "type": "object" From f427bb6c58bd9294a43dd3c230b776cf224c95c5 Mon Sep 17 00:00:00 2001 From: htcfreek <61519853+htcfreek@users.noreply.github.com> Date: Mon, 24 Jun 2024 17:18:06 +0200 Subject: [PATCH 12/15] update TerminalPaneContent.cpp --- src/cascadia/TerminalApp/TerminalPaneContent.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/cascadia/TerminalApp/TerminalPaneContent.cpp b/src/cascadia/TerminalApp/TerminalPaneContent.cpp index 5ecdb4bf560..f0c2a8d5852 100644 --- a/src/cascadia/TerminalApp/TerminalPaneContent.cpp +++ b/src/cascadia/TerminalApp/TerminalPaneContent.cpp @@ -235,6 +235,18 @@ namespace winrt::TerminalApp::implementation co_return; } + // We try to read the setting from the command line arguments + if (const auto& settings{ _cache.TryLookup(_profile) }) + { + const auto closeMode = settings.DefaultSettings().CloseOnExit(); + + // If the command line argument "keepOpen" is set to kepp the pane/tab/window open we stop further execution here. + if (closeMode == CloseOnExitMode::Never) + { + co_return; + } + } + if (_profile) { const auto mode = _profile.CloseOnExit(); From de62d0e8aedaff7fb849d0cdebb5f04c9d0ef7cb Mon Sep 17 00:00:00 2001 From: htcfreek <61519853+htcfreek@users.noreply.github.com> Date: Mon, 24 Jun 2024 17:50:58 +0200 Subject: [PATCH 13/15] add tests --- .../CommandlineTest.cpp | 126 ++++++++++++++++++ 1 file changed, 126 insertions(+) diff --git a/src/cascadia/LocalTests_TerminalApp/CommandlineTest.cpp b/src/cascadia/LocalTests_TerminalApp/CommandlineTest.cpp index f3c0efa463d..1fdbcbb249e 100644 --- a/src/cascadia/LocalTests_TerminalApp/CommandlineTest.cpp +++ b/src/cascadia/LocalTests_TerminalApp/CommandlineTest.cpp @@ -717,6 +717,69 @@ namespace TerminalAppLocalTests VERIFY_IS_FALSE(terminalArgs.ColorScheme().empty()); VERIFY_ARE_EQUAL(expectedScheme, terminalArgs.ColorScheme()); } + { + // Test for existing --KeepOpen parameter + AppCommandlineArgs appArgs{}; + std::vector rawCommands{ L"wt.exe", subcommand, L"-p", L"PowerShell", L"--KeepOpen" }; + _buildCommandlinesHelper(appArgs, 1u, rawCommands); + + VERIFY_ARE_EQUAL(1u, appArgs._startupActions.size()); + + auto actionAndArgs = appArgs._startupActions.at(0); + VERIFY_ARE_EQUAL(ShortcutAction::NewTab, actionAndArgs.Action()); + VERIFY_IS_NOT_NULL(actionAndArgs.Args()); + auto myArgs = actionAndArgs.Args().try_as(); + VERIFY_IS_NOT_NULL(myArgs); + auto terminalArgs{ myArgs.ContentArgs().try_as() }; + VERIFY_IS_NOT_NULL(terminalArgs); + VERIFY_IS_TRUE(terminalArgs.Commandline().empty()); + VERIFY_IS_NULL(terminalArgs.ProfileIndex()); + VERIFY_IS_FALSE(terminalArgs.Profile().empty()); + VERIFY_IS_TRUE(terminalArgs.KeepOpen()); + VERIFY_ARE_EQUAL(terminalArgs.Profile(), "PowerShell"); + } + { + // Test for existing -O parameter (Short form of --keepOpen) + AppCommandlineArgs appArgs{}; + std::vector rawCommands{ L"wt.exe", subcommand, L"-p", L"PowerShell", L"-o" }; + _buildCommandlinesHelper(appArgs, 1u, rawCommands); + + VERIFY_ARE_EQUAL(1u, appArgs._startupActions.size()); + + auto actionAndArgs = appArgs._startupActions.at(0); + VERIFY_ARE_EQUAL(ShortcutAction::NewTab, actionAndArgs.Action()); + VERIFY_IS_NOT_NULL(actionAndArgs.Args()); + auto myArgs = actionAndArgs.Args().try_as(); + VERIFY_IS_NOT_NULL(myArgs); + auto terminalArgs{ myArgs.ContentArgs().try_as() }; + VERIFY_IS_NOT_NULL(terminalArgs); + VERIFY_IS_TRUE(terminalArgs.Commandline().empty()); + VERIFY_IS_NULL(terminalArgs.ProfileIndex()); + VERIFY_IS_FALSE(terminalArgs.Profile().empty()); + VERIFY_IS_TRUE(terminalArgs.KeepOpen()); + VERIFY_ARE_EQUAL(terminalArgs.Profile(), "PowerShell"); + } + { + // Test for NOT existing --keepOpen parameter + AppCommandlineArgs appArgs{}; + std::vector rawCommands{ L"wt.exe", subcommand, L"-p", L"PowerShell" }; + _buildCommandlinesHelper(appArgs, 1u, rawCommands); + + VERIFY_ARE_EQUAL(1u, appArgs._startupActions.size()); + + auto actionAndArgs = appArgs._startupActions.at(0); + VERIFY_ARE_EQUAL(ShortcutAction::NewTab, actionAndArgs.Action()); + VERIFY_IS_NOT_NULL(actionAndArgs.Args()); + auto myArgs = actionAndArgs.Args().try_as(); + VERIFY_IS_NOT_NULL(myArgs); + auto terminalArgs{ myArgs.ContentArgs().try_as() }; + VERIFY_IS_NOT_NULL(terminalArgs); + VERIFY_IS_TRUE(terminalArgs.Commandline().empty()); + VERIFY_IS_NULL(terminalArgs.ProfileIndex()); + VERIFY_IS_FALSE(terminalArgs.Profile().empty()); + VERIFY_IS_FALSE(terminalArgs.KeepOpen()); + VERIFY_ARE_EQUAL(terminalArgs.Profile(), "PowerShell"); + } } void CommandlineTest::ParseSplitPaneIntoArgs() @@ -1041,6 +1104,69 @@ namespace TerminalAppLocalTests VERIFY_IS_TRUE(terminalArgs.Profile().empty()); VERIFY_ARE_EQUAL(L"powershell.exe \"This is an arg with spaces\"", terminalArgs.Commandline()); } + { + // Test for existing --KeepOpen parameter + AppCommandlineArgs appArgs{}; + std::vector rawCommands{ L"wt.exe", L"--KeepOpen", L"powershell.exe", L"This is an arg with spaces" }; + _buildCommandlinesHelper(appArgs, 1u, rawCommands); + + VERIFY_ARE_EQUAL(1u, appArgs._startupActions.size()); + + auto actionAndArgs = appArgs._startupActions.at(0); + VERIFY_ARE_EQUAL(ShortcutAction::NewTab, actionAndArgs.Action()); + VERIFY_IS_NOT_NULL(actionAndArgs.Args()); + auto myArgs = actionAndArgs.Args().try_as(); + VERIFY_IS_NOT_NULL(myArgs); + auto terminalArgs{ myArgs.ContentArgs().try_as() }; + VERIFY_IS_NOT_NULL(terminalArgs); + VERIFY_IS_FALSE(terminalArgs.Commandline().empty()); + VERIFY_IS_NULL(terminalArgs.ProfileIndex()); + VERIFY_IS_TRUE(terminalArgs.Profile().empty()); + VERIFY_IS_TRUE(terminalArgs.KeepOpen()); + VERIFY_ARE_EQUAL(L"powershell.exe \"This is an arg with spaces\"", terminalArgs.Commandline()); + } + { + // Test for existing -O parameter (Short form of --keepOpen) + AppCommandlineArgs appArgs{}; + std::vector rawCommands{ L"wt.exe", L"-O", L"powershell.exe", L"This is an arg with spaces" }; + _buildCommandlinesHelper(appArgs, 1u, rawCommands); + + VERIFY_ARE_EQUAL(1u, appArgs._startupActions.size()); + + auto actionAndArgs = appArgs._startupActions.at(0); + VERIFY_ARE_EQUAL(ShortcutAction::NewTab, actionAndArgs.Action()); + VERIFY_IS_NOT_NULL(actionAndArgs.Args()); + auto myArgs = actionAndArgs.Args().try_as(); + VERIFY_IS_NOT_NULL(myArgs); + auto terminalArgs{ myArgs.ContentArgs().try_as() }; + VERIFY_IS_NOT_NULL(terminalArgs); + VERIFY_IS_FALSE(terminalArgs.Commandline().empty()); + VERIFY_IS_NULL(terminalArgs.ProfileIndex()); + VERIFY_IS_TRUE(terminalArgs.Profile().empty()); + VERIFY_IS_TRUE(terminalArgs.KeepOpen()); + VERIFY_ARE_EQUAL(L"powershell.exe \"This is an arg with spaces\"", terminalArgs.Commandline()); + } + { + // Test for NOT existing --keepOpen parameter + AppCommandlineArgs appArgs{}; + std::vector rawCommands{ L"wt.exe", L"powershell.exe", L"This is an arg with spaces" }; + _buildCommandlinesHelper(appArgs, 1u, rawCommands); + + VERIFY_ARE_EQUAL(1u, appArgs._startupActions.size()); + + auto actionAndArgs = appArgs._startupActions.at(0); + VERIFY_ARE_EQUAL(ShortcutAction::NewTab, actionAndArgs.Action()); + VERIFY_IS_NOT_NULL(actionAndArgs.Args()); + auto myArgs = actionAndArgs.Args().try_as(); + VERIFY_IS_NOT_NULL(myArgs); + auto terminalArgs{ myArgs.ContentArgs().try_as() }; + VERIFY_IS_NOT_NULL(terminalArgs); + VERIFY_IS_FALSE(terminalArgs.Commandline().empty()); + VERIFY_IS_NULL(terminalArgs.ProfileIndex()); + VERIFY_IS_TRUE(terminalArgs.Profile().empty()); + VERIFY_IS_FALSE(terminalArgs.KeepOpen()); + VERIFY_ARE_EQUAL(L"powershell.exe \"This is an arg with spaces\"", terminalArgs.Commandline()); + } } void CommandlineTest::ParseFocusTabArgs() From 1f316fd2dbba3bf42e36a5cb69cbaa2c6b02189d Mon Sep 17 00:00:00 2001 From: htcfreek <61519853+htcfreek@users.noreply.github.com> Date: Mon, 24 Jun 2024 17:51:17 +0200 Subject: [PATCH 14/15] fix spelling --- src/cascadia/TerminalApp/TerminalPaneContent.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cascadia/TerminalApp/TerminalPaneContent.cpp b/src/cascadia/TerminalApp/TerminalPaneContent.cpp index f0c2a8d5852..64dd1544c8e 100644 --- a/src/cascadia/TerminalApp/TerminalPaneContent.cpp +++ b/src/cascadia/TerminalApp/TerminalPaneContent.cpp @@ -240,7 +240,7 @@ namespace winrt::TerminalApp::implementation { const auto closeMode = settings.DefaultSettings().CloseOnExit(); - // If the command line argument "keepOpen" is set to kepp the pane/tab/window open we stop further execution here. + // If the command line argument "keepOpen" is set to keep the pane/tab/window open we stop further execution here. if (closeMode == CloseOnExitMode::Never) { co_return; From 756d7b3e7860d1082ed87833521ed65638688abc Mon Sep 17 00:00:00 2001 From: htcfreek <61519853+htcfreek@users.noreply.github.com> Date: Mon, 24 Jun 2024 18:14:56 +0200 Subject: [PATCH 15/15] fix tests --- src/cascadia/LocalTests_TerminalApp/CommandlineTest.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cascadia/LocalTests_TerminalApp/CommandlineTest.cpp b/src/cascadia/LocalTests_TerminalApp/CommandlineTest.cpp index 1fdbcbb249e..96c63fce272 100644 --- a/src/cascadia/LocalTests_TerminalApp/CommandlineTest.cpp +++ b/src/cascadia/LocalTests_TerminalApp/CommandlineTest.cpp @@ -736,7 +736,7 @@ namespace TerminalAppLocalTests VERIFY_IS_NULL(terminalArgs.ProfileIndex()); VERIFY_IS_FALSE(terminalArgs.Profile().empty()); VERIFY_IS_TRUE(terminalArgs.KeepOpen()); - VERIFY_ARE_EQUAL(terminalArgs.Profile(), "PowerShell"); + VERIFY_ARE_EQUAL(terminalArgs.Profile(), L"PowerShell"); } { // Test for existing -O parameter (Short form of --keepOpen) @@ -757,7 +757,7 @@ namespace TerminalAppLocalTests VERIFY_IS_NULL(terminalArgs.ProfileIndex()); VERIFY_IS_FALSE(terminalArgs.Profile().empty()); VERIFY_IS_TRUE(terminalArgs.KeepOpen()); - VERIFY_ARE_EQUAL(terminalArgs.Profile(), "PowerShell"); + VERIFY_ARE_EQUAL(terminalArgs.Profile(), L"PowerShell"); } { // Test for NOT existing --keepOpen parameter @@ -778,7 +778,7 @@ namespace TerminalAppLocalTests VERIFY_IS_NULL(terminalArgs.ProfileIndex()); VERIFY_IS_FALSE(terminalArgs.Profile().empty()); VERIFY_IS_FALSE(terminalArgs.KeepOpen()); - VERIFY_ARE_EQUAL(terminalArgs.Profile(), "PowerShell"); + VERIFY_ARE_EQUAL(terminalArgs.Profile(), L"PowerShell"); } }