diff --git a/.github/actions/spelling/allow/allow.txt b/.github/actions/spelling/allow/allow.txt index 35742a611..085ff6682 100644 --- a/.github/actions/spelling/allow/allow.txt +++ b/.github/actions/spelling/allow/allow.txt @@ -41,6 +41,7 @@ Lmid Lorigin maxed mkmk +mnt mru noreply nje diff --git a/src/cascadia/TerminalControl/IControlSettings.idl b/src/cascadia/TerminalControl/IControlSettings.idl index 1b67df91f..2b16e7334 100644 --- a/src/cascadia/TerminalControl/IControlSettings.idl +++ b/src/cascadia/TerminalControl/IControlSettings.idl @@ -27,6 +27,7 @@ namespace Microsoft.Terminal.Control interface IControlSettings requires Microsoft.Terminal.Core.ICoreSettings, Microsoft.Terminal.Control.IControlAppearance { String ProfileName; + String ProfileSource; Boolean UseAcrylic; ScrollbarState ScrollState; diff --git a/src/cascadia/TerminalControl/TermControl.cpp b/src/cascadia/TerminalControl/TermControl.cpp index afae49d9d..7da2257b4 100644 --- a/src/cascadia/TerminalControl/TermControl.cpp +++ b/src/cascadia/TerminalControl/TermControl.cpp @@ -2271,6 +2271,42 @@ namespace winrt::Microsoft::Terminal::Control::implementation } std::wstring fullPath{ item.Path() }; + + // Fix path for WSL + if (_settings.ProfileSource() == L"Windows.Terminal.Wsl") + { + std::replace(fullPath.begin(), fullPath.end(), L'\\', L'/'); + + if (fullPath.size() >= 2 && fullPath.at(1) == L':') + { + // C:/foo/bar -> Cc/foo/bar + fullPath.at(1) = til::tolower_ascii(fullPath.at(0)); + // Cc/foo/bar -> /mnt/c/foo/bar + fullPath.replace(0, 1, L"/mnt/"); + } + else + { + static constexpr std::wstring_view wslPathPrefixes[] = { L"//wsl.localhost/", L"//wsl$/" }; + for (auto prefix : wslPathPrefixes) + { + if (til::starts_with(fullPath, prefix)) + { + if (const auto idx = fullPath.find(L'/', prefix.size()); idx != std::wstring::npos) + { + // //wsl.localhost/Ubuntu-18.04/foo/bar -> /foo/bar + fullPath.erase(0, idx); + } + else + { + // //wsl.localhost/Ubuntu-18.04 -> / + fullPath = L"/"; + } + break; + } + } + } + } + const auto containsSpaces = std::find(fullPath.begin(), fullPath.end(), L' ') != fullPath.end(); @@ -2283,6 +2319,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation allPaths += fullPath; } + _core.PasteText(winrt::hstring{ allPaths }); } } diff --git a/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp b/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp index 5e4d1eeea..ae9953986 100644 --- a/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp +++ b/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp @@ -275,6 +275,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation // Fill in the remaining properties from the profile _ProfileName = profile.Name(); + _ProfileSource = profile.Source(); _UseAcrylic = profile.UseAcrylic(); _FontFace = profile.FontInfo().FontFace(); diff --git a/src/cascadia/TerminalSettingsModel/TerminalSettings.h b/src/cascadia/TerminalSettingsModel/TerminalSettings.h index 90b7b60fe..096f18f79 100644 --- a/src/cascadia/TerminalSettingsModel/TerminalSettings.h +++ b/src/cascadia/TerminalSettingsModel/TerminalSettings.h @@ -119,6 +119,8 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation // ------------------------ End of Core Settings ----------------------- INHERITABLE_SETTING(Model::TerminalSettings, hstring, ProfileName); + INHERITABLE_SETTING(Model::TerminalSettings, hstring, ProfileSource); + INHERITABLE_SETTING(Model::TerminalSettings, bool, UseAcrylic, false); INHERITABLE_SETTING(Model::TerminalSettings, double, Opacity, UseAcrylic() ? 0.5 : 1.0); INHERITABLE_SETTING(Model::TerminalSettings, hstring, Padding, DEFAULT_PADDING); diff --git a/src/cascadia/UnitTests_Control/MockControlSettings.h b/src/cascadia/UnitTests_Control/MockControlSettings.h index 485f9b146..983d7a9d7 100644 --- a/src/cascadia/UnitTests_Control/MockControlSettings.h +++ b/src/cascadia/UnitTests_Control/MockControlSettings.h @@ -51,6 +51,7 @@ namespace ControlUnitTests // ------------------------ End of Core Settings ----------------------- WINRT_PROPERTY(winrt::hstring, ProfileName); + WINRT_PROPERTY(winrt::hstring, ProfileSource); WINRT_PROPERTY(bool, UseAcrylic, false); WINRT_PROPERTY(double, Opacity, .5); WINRT_PROPERTY(winrt::hstring, Padding, DEFAULT_PADDING);