From 376ecff8cb73724825323192509b231d9adbf76e Mon Sep 17 00:00:00 2001 From: Jeremy Banks Date: Wed, 29 May 2019 07:43:42 -0400 Subject: [PATCH 01/11] Code to add WSLProfiles. --- src/cascadia/TerminalApp/CascadiaSettings.cpp | 50 +++++++++++++++++++ src/cascadia/TerminalApp/TerminalApp.vcxproj | 12 +---- 2 files changed, 52 insertions(+), 10 deletions(-) diff --git a/src/cascadia/TerminalApp/CascadiaSettings.cpp b/src/cascadia/TerminalApp/CascadiaSettings.cpp index f0e31ea9c03..eca6e0b8e9f 100644 --- a/src/cascadia/TerminalApp/CascadiaSettings.cpp +++ b/src/cascadia/TerminalApp/CascadiaSettings.cpp @@ -4,6 +4,9 @@ #include "pch.h" #include #include +#include +#include +#include #include "CascadiaSettings.h" #include "../../types/inc/utils.hpp" #include "../../inc/DefaultSettings.h" @@ -227,6 +230,53 @@ void CascadiaSettings::_CreateDefaultProfiles() _profiles.emplace_back(powershellProfile); _profiles.emplace_back(cmdProfile); + + HANDLE readPipe; + HANDLE writePipe; + SECURITY_ATTRIBUTES sa{ sizeof(sa), nullptr, true }; + if (CreatePipe(&readPipe, &writePipe, &sa, 0)) { + STARTUPINFO si{}; + si.cb = sizeof(si); + si.dwFlags = STARTF_USESTDHANDLES; + si.hStdOutput = writePipe; + si.hStdError = writePipe; + + PROCESS_INFORMATION pi{}; + std::wstring command = L"wsl.exe --list"; + bool processSuccess = CreateProcessW(nullptr, const_cast(command.c_str()), nullptr, nullptr, + TRUE, CREATE_NO_WINDOW, nullptr, nullptr, &si, &pi); + if (processSuccess) { + WaitForSingleObject(pi.hProcess, INFINITE); + DWORD exitCode; + HRESULT hr = 0; + if ((GetExitCodeProcess(pi.hProcess, &exitCode) == false) || (exitCode != 0)) { + hr = E_INVALIDARG; + } + if (SUCCEEDED(hr)) { + DWORD bytesAvailable = 0; + PeekNamedPipe(readPipe, nullptr, NULL, nullptr, &bytesAvailable, nullptr); + std::wfstream pipe{ _wfdopen(_open_osfhandle((intptr_t)readPipe, _O_WTEXT | _O_RDONLY), L"r") }; + std::wstring wline = L""; + std::getline(pipe, wline); //remove the header from the output. + while (pipe.tellp() < bytesAvailable) { + std::getline(pipe, wline); + std::wstringstream wlinestream(wline); + std::wstring name = L""; + if (wlinestream) { + std::getline(wlinestream, name, L' '); + auto WSLDistro{ _CreateDefaultProfile(name) }; + WSLDistro.SetCommandline(L"wsl.exe -d " + name); + WSLDistro.SetColorScheme({ L"Campbell" }); + _profiles.emplace_back(WSLDistro); + } + } + } + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + } + CloseHandle(readPipe); + CloseHandle(writePipe); + } } // Method Description: diff --git a/src/cascadia/TerminalApp/TerminalApp.vcxproj b/src/cascadia/TerminalApp/TerminalApp.vcxproj index 0aa7e8fb1f8..b152b3cdba0 100644 --- a/src/cascadia/TerminalApp/TerminalApp.vcxproj +++ b/src/cascadia/TerminalApp/TerminalApp.vcxproj @@ -15,7 +15,6 @@ TerminalApp TerminalApp - - @@ -50,7 +48,6 @@ App.xaml - @@ -71,7 +68,6 @@ - @@ -79,13 +75,11 @@ - - {015a0047-772d-4f1a-88c9-45c18f0adfb6} true true - + @@ -48,6 +50,7 @@ App.xaml + @@ -68,6 +71,7 @@ + @@ -75,11 +79,13 @@ + + {015a0047-772d-4f1a-88c9-45c18f0adfb6} true true +