diff --git a/src/cascadia/TerminalApp/TerminalPage.cpp b/src/cascadia/TerminalApp/TerminalPage.cpp index 678d70f2ae..7be3419840 100644 --- a/src/cascadia/TerminalApp/TerminalPage.cpp +++ b/src/cascadia/TerminalApp/TerminalPage.cpp @@ -1134,6 +1134,7 @@ namespace winrt::TerminalApp::implementation if (dispatchToElevatedWindow) { + newTerminalArgs.StartingDirectory(_evaluatePathForCwd(newTerminalArgs.StartingDirectory())); _OpenElevatedWT(newTerminalArgs); } else @@ -1174,6 +1175,23 @@ namespace winrt::TerminalApp::implementation } } + winrt::hstring TerminalPage::_evaluatePathForCwd(const winrt::hstring& path) + { + auto resultPath{ path }; + const bool looksLikeLinux = resultPath.size() == 1 && + (resultPath[0] == L'~' || resultPath[0] == L'/'); + // if (newWorkingDirectory.size() == 0 || looksLikeLinux) + if (!looksLikeLinux) + { // We only want to resolve the new WD against the CWD if it doesn't look like a Linux path (see GH#592) + // auto cwdString{ wil::GetCurrentDirectoryW() }; + auto cwdString{ _WindowProperties.VirtualWorkingDirectory().c_str() }; + std::filesystem::path cwd{ cwdString }; + cwd /= path.c_str(); + resultPath = winrt::hstring{ cwd.wstring() }; + } + return resultPath; + } + // Method Description: // - Creates a new connection based on the profile settings // Arguments: @@ -1242,18 +1260,18 @@ namespace winrt::TerminalApp::implementation // construction, because the connection might not spawn the child // process until later, on another thread, after we've already // restored the CWD to its original value. - auto newWorkingDirectory{ settings.StartingDirectory() }; - const bool looksLikeLinux = newWorkingDirectory.size() == 1 && - (newWorkingDirectory[0] == L'~' || newWorkingDirectory[0] == L'/'); - // if (newWorkingDirectory.size() == 0 || looksLikeLinux) - if (!looksLikeLinux) - { // We only want to resolve the new WD against the CWD if it doesn't look like a Linux path (see GH#592) - // auto cwdString{ wil::GetCurrentDirectoryW() }; - auto cwdString{ _WindowProperties.VirtualWorkingDirectory().c_str() }; - std::filesystem::path cwd{ cwdString }; - cwd /= settings.StartingDirectory().c_str(); - newWorkingDirectory = winrt::hstring{ cwd.wstring() }; - } + auto newWorkingDirectory{ _evaluatePathForCwd(settings.StartingDirectory()) }; + // const bool looksLikeLinux = newWorkingDirectory.size() == 1 && + // (newWorkingDirectory[0] == L'~' || newWorkingDirectory[0] == L'/'); + // // if (newWorkingDirectory.size() == 0 || looksLikeLinux) + // if (!looksLikeLinux) + // { // We only want to resolve the new WD against the CWD if it doesn't look like a Linux path (see GH#592) + // // auto cwdString{ wil::GetCurrentDirectoryW() }; + // auto cwdString{ _WindowProperties.VirtualWorkingDirectory().c_str() }; + // std::filesystem::path cwd{ cwdString }; + // cwd /= settings.StartingDirectory().c_str(); + // newWorkingDirectory = winrt::hstring{ cwd.wstring() }; + // } auto conhostConn = TerminalConnection::ConptyConnection(); auto valueSet = TerminalConnection::ConptyConnection::CreateSettings(settings.Commandline(), @@ -4273,6 +4291,9 @@ namespace winrt::TerminalApp::implementation // whatever the default profile's GUID is. newTerminalArgs.Profile(::Microsoft::Console::Utils::GuidToString(profile.Guid())); + + newTerminalArgs.StartingDirectory(_evaluatePathForCwd(controlSettings.DefaultSettings().StartingDirectory())); + _OpenElevatedWT(newTerminalArgs); return true; } diff --git a/src/cascadia/TerminalApp/TerminalPage.h b/src/cascadia/TerminalApp/TerminalPage.h index 95c291ee20..5f289fd0da 100644 --- a/src/cascadia/TerminalApp/TerminalPage.h +++ b/src/cascadia/TerminalApp/TerminalPage.h @@ -295,6 +295,9 @@ namespace winrt::TerminalApp::implementation void _OpenNewTabDropdown(); HRESULT _OpenNewTab(const Microsoft::Terminal::Settings::Model::NewTerminalArgs& newTerminalArgs, winrt::Microsoft::Terminal::TerminalConnection::ITerminalConnection existingConnection = nullptr); void _CreateNewTabFromPane(std::shared_ptr pane, uint32_t insertPosition = -1); + + winrt::hstring _evaluatePathForCwd(const winrt::hstring& path); + winrt::Microsoft::Terminal::TerminalConnection::ITerminalConnection _CreateConnectionFromSettings(Microsoft::Terminal::Settings::Model::Profile profile, Microsoft::Terminal::Settings::Model::TerminalSettings settings, const bool inheritCursor); winrt::Microsoft::Terminal::TerminalConnection::ITerminalConnection _duplicateConnectionForRestart(std::shared_ptr pane); void _restartPaneConnection(const std::shared_ptr& pane);