diff --git a/.github/actions/spell-check/dictionary/apis.txt b/.github/actions/spell-check/dictionary/apis.txt index 1fbbbbcd37a..7fcb207f178 100644 --- a/.github/actions/spell-check/dictionary/apis.txt +++ b/.github/actions/spell-check/dictionary/apis.txt @@ -1,3 +1,4 @@ +IMap ICustom IObject LCID diff --git a/src/cascadia/TerminalApp/TerminalPage.cpp b/src/cascadia/TerminalApp/TerminalPage.cpp index a09f0cc8461..d7c143a0670 100644 --- a/src/cascadia/TerminalApp/TerminalPage.cpp +++ b/src/cascadia/TerminalApp/TerminalPage.cpp @@ -19,6 +19,7 @@ #include "DebugTapConnection.h" using namespace winrt; +using namespace winrt::Windows::Foundation::Collections; using namespace winrt::Windows::UI::Xaml; using namespace winrt::Windows::UI::Core; using namespace winrt::Windows::System; @@ -572,7 +573,13 @@ namespace winrt::TerminalApp::implementation // TODO GH#4661: Replace this with directly using the AzCon when our VT is better std::filesystem::path azBridgePath{ wil::GetModuleFileNameW(nullptr) }; azBridgePath.replace_filename(L"TerminalAzBridge.exe"); - connection = TerminalConnection::ConptyConnection(azBridgePath.wstring(), L".", L"Azure", settings.InitialRows(), settings.InitialCols(), winrt::guid()); + connection = TerminalConnection::ConptyConnection(azBridgePath.wstring(), + L".", + L"Azure", + nullptr, + settings.InitialRows(), + settings.InitialCols(), + winrt::guid()); } else if (profile->HasConnectionType() && @@ -583,12 +590,21 @@ namespace winrt::TerminalApp::implementation else { - auto conhostConn = TerminalConnection::ConptyConnection(settings.Commandline(), - settings.StartingDirectory(), - settings.StartingTitle(), - settings.InitialRows(), - settings.InitialCols(), - winrt::guid()); + std::wstring guidWString = Utils::GuidToString(profileGuid); + + StringMap envMap{}; + envMap.Insert(L"WT_PROFILE_ID", guidWString); + envMap.Insert(L"WSLENV", L"WT_PROFILE_ID"); + + auto conhostConn = TerminalConnection::ConptyConnection( + settings.Commandline(), + settings.StartingDirectory(), + settings.StartingTitle(), + envMap.GetView(), + settings.InitialRows(), + settings.InitialCols(), + winrt::guid()); + sessionGuid = conhostConn.Guid(); connection = conhostConn; } diff --git a/src/cascadia/TerminalConnection/ConptyConnection.cpp b/src/cascadia/TerminalConnection/ConptyConnection.cpp index be00982981a..b0a0482c01f 100644 --- a/src/cascadia/TerminalConnection/ConptyConnection.cpp +++ b/src/cascadia/TerminalConnection/ConptyConnection.cpp @@ -13,7 +13,7 @@ #include "ConptyConnection.g.cpp" -#include "../../types/inc/Utils.hpp" +#include "../../types/inc/utils.hpp" #include "../../types/inc/Environment.hpp" #include "LibraryResources.h" @@ -110,9 +110,29 @@ namespace winrt::Microsoft::Terminal::TerminalConnection::implementation // Ensure every connection has the unique identifier in the environment. environment.insert_or_assign(L"WT_SESSION", guidSubStr.data()); - auto wslEnv = environment[L"WSLENV"]; // We always want to load something, even if it's blank. + if (_environment) + { + // add additional WT env vars like WT_SETTINGS, WT_DEFAULTS and WT_PROFILE_ID + for (auto item : _environment) + { + auto key = item.Key(); + auto value = item.Value(); + + // avoid clobbering WSLENV + if (std::wstring_view{ key } == L"WSLENV") + { + auto current = environment[L"WSLENV"]; + value = current + L":" + value; + } + + environment.insert_or_assign(key.c_str(), value.c_str()); + } + } + // WSLENV is a colon-delimited list of environment variables (+flags) that should appear inside WSL // https://devblogs.microsoft.com/commandline/share-environment-vars-between-wsl-and-windows/ + + auto wslEnv = environment[L"WSLENV"]; wslEnv = L"WT_SESSION:" + wslEnv; // prepend WT_SESSION to make sure it's visible inside WSL. environment.insert_or_assign(L"WSLENV", wslEnv); } @@ -173,6 +193,7 @@ namespace winrt::Microsoft::Terminal::TerminalConnection::implementation ConptyConnection::ConptyConnection(const hstring& commandline, const hstring& startingDirectory, const hstring& startingTitle, + const Windows::Foundation::Collections::IMapView& environment, const uint32_t initialRows, const uint32_t initialCols, const guid& initialGuid) : @@ -181,6 +202,7 @@ namespace winrt::Microsoft::Terminal::TerminalConnection::implementation _commandline{ commandline }, _startingDirectory{ startingDirectory }, _startingTitle{ startingTitle }, + _environment{ environment }, _guid{ initialGuid }, _u8State{}, _u16Str{}, diff --git a/src/cascadia/TerminalConnection/ConptyConnection.h b/src/cascadia/TerminalConnection/ConptyConnection.h index b450f657ee1..b3ca0827aa8 100644 --- a/src/cascadia/TerminalConnection/ConptyConnection.h +++ b/src/cascadia/TerminalConnection/ConptyConnection.h @@ -19,7 +19,14 @@ namespace winrt::Microsoft::Terminal::TerminalConnection::implementation { struct ConptyConnection : ConptyConnectionT, ConnectionStateHolder { - ConptyConnection(const hstring& cmdline, const hstring& startingDirectory, const hstring& startingTitle, const uint32_t rows, const uint32_t cols, const guid& guid); + ConptyConnection( + const hstring& cmdline, + const hstring& startingDirectory, + const hstring& startingTitle, + const Windows::Foundation::Collections::IMapView& environment, + const uint32_t rows, + const uint32_t cols, + const guid& guid); void Start(); void WriteInput(hstring const& data); @@ -40,6 +47,7 @@ namespace winrt::Microsoft::Terminal::TerminalConnection::implementation hstring _commandline; hstring _startingDirectory; hstring _startingTitle; + Windows::Foundation::Collections::IMapView _environment; guid _guid{}; // A unique session identifier for connected client hstring _clientName{}; // The name of the process hosted by this ConPTY connection (as of launch). diff --git a/src/cascadia/TerminalConnection/ConptyConnection.idl b/src/cascadia/TerminalConnection/ConptyConnection.idl index 03ca83913ee..fc53f368b6d 100644 --- a/src/cascadia/TerminalConnection/ConptyConnection.idl +++ b/src/cascadia/TerminalConnection/ConptyConnection.idl @@ -8,7 +8,7 @@ namespace Microsoft.Terminal.TerminalConnection [default_interface] runtimeclass ConptyConnection : ITerminalConnection { - ConptyConnection(String cmdline, String startingDirectory, String startingTitle, UInt32 rows, UInt32 columns, Guid guid); + ConptyConnection(String cmdline, String startingDirectory, String startingTitle, IMapView environment, UInt32 rows, UInt32 columns, Guid guid); Guid Guid { get; }; };