diff --git a/src/cascadia/TerminalApp/AppLogic.cpp b/src/cascadia/TerminalApp/AppLogic.cpp index ec6ebf50fc..445ad6a423 100644 --- a/src/cascadia/TerminalApp/AppLogic.cpp +++ b/src/cascadia/TerminalApp/AppLogic.cpp @@ -1472,6 +1472,11 @@ namespace winrt::TerminalApp::implementation return _root != nullptr ? _root->ShouldUsePersistedLayout(_settings) : false; } + bool AppLogic::ShouldActuallySpawnPersistedLayouts() + { + return _root != nullptr ? _root->ShouldActuallySpawnPersistedLayouts() : false; + } + void AppLogic::SaveWindowLayoutJsons(const Windows::Foundation::Collections::IVector& layouts) { std::vector converted; diff --git a/src/cascadia/TerminalApp/AppLogic.h b/src/cascadia/TerminalApp/AppLogic.h index 19e891843b..8132153065 100644 --- a/src/cascadia/TerminalApp/AppLogic.h +++ b/src/cascadia/TerminalApp/AppLogic.h @@ -81,6 +81,7 @@ namespace winrt::TerminalApp::implementation bool AlwaysOnTop() const; bool ShouldUsePersistedLayout(); + bool ShouldActuallySpawnPersistedLayouts(); hstring GetWindowLayoutJson(Microsoft::Terminal::Settings::Model::LaunchPosition position); void SaveWindowLayoutJsons(const Windows::Foundation::Collections::IVector& layouts); void IdentifyWindow(); diff --git a/src/cascadia/TerminalApp/AppLogic.idl b/src/cascadia/TerminalApp/AppLogic.idl index 9121c3ccf9..7e234e3ca2 100644 --- a/src/cascadia/TerminalApp/AppLogic.idl +++ b/src/cascadia/TerminalApp/AppLogic.idl @@ -93,6 +93,7 @@ namespace TerminalApp TaskbarState TaskbarState{ get; }; Boolean ShouldUsePersistedLayout(); + Boolean ShouldActuallySpawnPersistedLayouts(); String GetWindowLayoutJson(Microsoft.Terminal.Settings.Model.LaunchPosition position); void SaveWindowLayoutJsons(Windows.Foundation.Collections.IVector layouts); diff --git a/src/cascadia/TerminalApp/TerminalPage.cpp b/src/cascadia/TerminalApp/TerminalPage.cpp index 4d0e458405..2684a348b6 100644 --- a/src/cascadia/TerminalApp/TerminalPage.cpp +++ b/src/cascadia/TerminalApp/TerminalPage.cpp @@ -302,6 +302,31 @@ namespace winrt::TerminalApp::implementation settings.GlobalSettings().FirstWindowPreference() == FirstWindowPreference::PersistedWindowLayout; } + bool TerminalPage::ShouldActuallySpawnPersistedLayouts() const + { + if (!_startupActions || IsElevated()) + { + // there arent startup actions, or we're elevated. In that case, go for it. + return true; + } + + // Check that there's at least one action that's not just an elevated newTab action. + for (const auto& action : _startupActions) + { + if (action.Action() == ShortcutAction::NewTab) + { + const auto& args{ action.Args().try_as() }; + if (args && args.TerminalArgs().Elevate()) + { + continue; + } + } + + return true; + } + return false; + } + // Method Description; // - Checks if the current window is configured to load a particular layout // Arguments: diff --git a/src/cascadia/TerminalApp/TerminalPage.h b/src/cascadia/TerminalApp/TerminalPage.h index bbe9e4f2ec..f3178e7bc0 100644 --- a/src/cascadia/TerminalApp/TerminalPage.h +++ b/src/cascadia/TerminalApp/TerminalPage.h @@ -64,6 +64,7 @@ namespace winrt::TerminalApp::implementation void Create(); bool ShouldUsePersistedLayout(Microsoft::Terminal::Settings::Model::CascadiaSettings& settings) const; + bool ShouldActuallySpawnPersistedLayouts() const; std::optional LoadPersistedLayoutIdx(Microsoft::Terminal::Settings::Model::CascadiaSettings& settings) const; winrt::Microsoft::Terminal::Settings::Model::WindowLayout LoadPersistedLayout(Microsoft::Terminal::Settings::Model::CascadiaSettings& settings) const; Microsoft::Terminal::Settings::Model::WindowLayout GetWindowLayout(); diff --git a/src/cascadia/WindowsTerminal/AppHost.cpp b/src/cascadia/WindowsTerminal/AppHost.cpp index c8ffa8320e..5d192a696b 100644 --- a/src/cascadia/WindowsTerminal/AppHost.cpp +++ b/src/cascadia/WindowsTerminal/AppHost.cpp @@ -231,7 +231,10 @@ void AppHost::_HandleCommandlineArgs() { const auto numPeasants = _windowManager.GetNumberOfPeasants(); const auto layouts = ApplicationState::SharedInstance().PersistedWindowLayouts(); - if (_logic.ShouldUsePersistedLayout() && layouts && layouts.Size() > 0) + if (_logic.ShouldUsePersistedLayout() && + layouts && + layouts.Size() > 0 && + _logic.ShouldActuallySpawnPersistedLayouts()) { uint32_t startIdx = 0; // We want to create a window for every saved layout.