From f9d01356edb468f59d4fdf3de9366a3b96b80d7b Mon Sep 17 00:00:00 2001 From: Ian O'Neill Date: Sun, 1 Aug 2021 19:16:59 +0100 Subject: [PATCH 1/2] Fix drag and drop on '+' for drive letters --- src/cascadia/TerminalApp/TerminalPage.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cascadia/TerminalApp/TerminalPage.cpp b/src/cascadia/TerminalApp/TerminalPage.cpp index 09cc175d693..0fa37d044e8 100644 --- a/src/cascadia/TerminalApp/TerminalPage.cpp +++ b/src/cascadia/TerminalApp/TerminalPage.cpp @@ -255,10 +255,10 @@ namespace winrt::TerminalApp::implementation std::wstring pathText = path.wstring(); - // Handle edge case of "C:\\", seems like the "StartingDirectory" doesn't like path which ends with '\' + // Handle edge case of "C:\" - add a '.' to the end if (pathText.back() == L'\\') { - pathText.erase(std::prev(pathText.end())); + pathText.push_back(L'.'); } NewTerminalArgs args; From 909a9acc7f523b56051e58694fb6419e4a42129b Mon Sep 17 00:00:00 2001 From: Ian O'Neill Date: Mon, 2 Aug 2021 20:48:38 +0100 Subject: [PATCH 2/2] Address review comment --- .../LocalTests_SettingsModel/CommandTests.cpp | 21 ++++++++++++++++++- src/cascadia/TerminalApp/TerminalPage.cpp | 10 +-------- .../TerminalSettingsModel/ActionArgs.cpp | 5 ++++- 3 files changed, 25 insertions(+), 11 deletions(-) diff --git a/src/cascadia/LocalTests_SettingsModel/CommandTests.cpp b/src/cascadia/LocalTests_SettingsModel/CommandTests.cpp index ce5f06014c6..bdc4d569298 100644 --- a/src/cascadia/LocalTests_SettingsModel/CommandTests.cpp +++ b/src/cascadia/LocalTests_SettingsModel/CommandTests.cpp @@ -397,6 +397,10 @@ namespace SettingsModelLocalTests "name":"action6", "command": { "action": "newWindow", "startingDirectory":"C:\\foo", "commandline": "bar.exe" } }, + { + "name":"action7_startingDirectoryWithTrailingSlash", + "command": { "action": "newWindow", "startingDirectory":"C:\\", "commandline": "bar.exe" } + }, ])" }; const auto commands0Json = VerifyParseSucceeded(commands0String); @@ -405,7 +409,7 @@ namespace SettingsModelLocalTests VERIFY_ARE_EQUAL(0u, commands.Size()); auto warnings = implementation::Command::LayerJson(commands, commands0Json); VERIFY_ARE_EQUAL(0u, warnings.size()); - VERIFY_ARE_EQUAL(7u, commands.Size()); + VERIFY_ARE_EQUAL(8u, commands.Size()); { auto command = commands.Lookup(L"action0"); @@ -503,5 +507,20 @@ namespace SettingsModelLocalTests L"cmdline: \"%s\"", cmdline.c_str())); VERIFY_ARE_EQUAL(L"--startingDirectory \"C:\\foo\" -- \"bar.exe\"", terminalArgs.ToCommandline()); } + + { + auto command = commands.Lookup(L"action7_startingDirectoryWithTrailingSlash"); + VERIFY_IS_NOT_NULL(command); + VERIFY_IS_NOT_NULL(command.ActionAndArgs()); + VERIFY_ARE_EQUAL(ShortcutAction::NewWindow, command.ActionAndArgs().Action()); + const auto& realArgs = command.ActionAndArgs().Args().try_as(); + VERIFY_IS_NOT_NULL(realArgs); + const auto& terminalArgs = realArgs.TerminalArgs(); + VERIFY_IS_NOT_NULL(terminalArgs); + auto cmdline = terminalArgs.ToCommandline(); + Log::Comment(NoThrowString().Format( + L"cmdline: \"%s\"", cmdline.c_str())); + VERIFY_ARE_EQUAL(L"--startingDirectory \"C:\\\\\" -- \"bar.exe\"", terminalArgs.ToCommandline()); + } } } diff --git a/src/cascadia/TerminalApp/TerminalPage.cpp b/src/cascadia/TerminalApp/TerminalPage.cpp index 0fa37d044e8..cac64f193b7 100644 --- a/src/cascadia/TerminalApp/TerminalPage.cpp +++ b/src/cascadia/TerminalApp/TerminalPage.cpp @@ -253,16 +253,8 @@ namespace winrt::TerminalApp::implementation path = path.parent_path(); } - std::wstring pathText = path.wstring(); - - // Handle edge case of "C:\" - add a '.' to the end - if (pathText.back() == L'\\') - { - pathText.push_back(L'.'); - } - NewTerminalArgs args; - args.StartingDirectory(winrt::hstring{ pathText }); + args.StartingDirectory(winrt::hstring{ path.wstring() }); this->_OpenNewTerminal(args); TraceLoggingWrite( diff --git a/src/cascadia/TerminalSettingsModel/ActionArgs.cpp b/src/cascadia/TerminalSettingsModel/ActionArgs.cpp index 7bc057742c0..9baaaf240bc 100644 --- a/src/cascadia/TerminalSettingsModel/ActionArgs.cpp +++ b/src/cascadia/TerminalSettingsModel/ActionArgs.cpp @@ -118,7 +118,10 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation if (!StartingDirectory().empty()) { - ss << fmt::format(L"--startingDirectory \"{}\" ", StartingDirectory()); + // If the directory ends in a '\', we need to add another one on so that the enclosing quote added + // afterwards isn't escaped + const auto trailingBackslashEscape = StartingDirectory().back() == L'\\' ? L"\\" : L""; + ss << fmt::format(L"--startingDirectory \"{}{}\" ", StartingDirectory(), trailingBackslashEscape); } if (!TabTitle().empty())