From 3b32931bb9a5b7e21b45182f243aeac90366aa54 Mon Sep 17 00:00:00 2001 From: AmirMS <104940545+AmelBawa-msft@users.noreply.github.com> Date: Mon, 23 Mar 2026 19:51:57 -0700 Subject: [PATCH 1/3] Container cursor --- src/windows/wslc/services/ConsoleService.cpp | 49 ++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/src/windows/wslc/services/ConsoleService.cpp b/src/windows/wslc/services/ConsoleService.cpp index 0f1f7aa36..e066878d2 100644 --- a/src/windows/wslc/services/ConsoleService.cpp +++ b/src/windows/wslc/services/ConsoleService.cpp @@ -21,10 +21,59 @@ using wsl::windows::common::ClientRunningWSLAProcess; using wsl::windows::common::relay::ReadHandle; using wsl::windows::common::relay::RelayHandle; +class ScopedCursorVisibility +{ +public: + ScopedCursorVisibility() + { + m_outputHandle.reset(CreateFileW( + L"CONOUT$", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, OPEN_EXISTING, 0, nullptr)); + + if (!m_outputHandle) + { + LOG_LAST_ERROR_MSG("CreateFileW(CONOUT$) failed"); + return; + } + + CONSOLE_CURSOR_INFO cursorInfo{}; + if (!GetConsoleCursorInfo(m_outputHandle.get(), &cursorInfo)) + { + LOG_LAST_ERROR_MSG("GetConsoleCursorInfo failed"); + return; + } + + m_savedCursorInfo = cursorInfo; + + if (!cursorInfo.bVisible) + { + cursorInfo.bVisible = TRUE; + LOG_IF_WIN32_BOOL_FALSE(SetConsoleCursorInfo(m_outputHandle.get(), &cursorInfo)); + } + } + + ~ScopedCursorVisibility() + { + if (m_outputHandle && m_savedCursorInfo.has_value()) + { + LOG_IF_WIN32_BOOL_FALSE(SetConsoleCursorInfo(m_outputHandle.get(), &m_savedCursorInfo.value())); + } + } + + ScopedCursorVisibility(const ScopedCursorVisibility&) = delete; + ScopedCursorVisibility& operator=(const ScopedCursorVisibility&) = delete; + ScopedCursorVisibility(ScopedCursorVisibility&&) = delete; + ScopedCursorVisibility& operator=(ScopedCursorVisibility&&) = delete; + +private: + wil::unique_hfile m_outputHandle; + std::optional m_savedCursorInfo{}; +}; + bool ConsoleService::RelayInteractiveTty(ClientRunningWSLAProcess& Process, HANDLE Tty, bool triggerRefresh) { // Configure console for interactive usage. wsl::windows::common::ConsoleState console; + ScopedCursorVisibility cursorVisibility; if (triggerRefresh) { From 473bb3755c72779505f6cdab313c980b4c1dbd1f Mon Sep 17 00:00:00 2001 From: AmirMS <104940545+AmelBawa-msft@users.noreply.github.com> Date: Mon, 23 Mar 2026 20:29:17 -0700 Subject: [PATCH 2/3] Update pull image callback --- src/windows/wslc/services/ConsoleService.cpp | 49 ------------------- .../wslc/services/ContainerService.cpp | 21 +++++--- src/windows/wslc/services/ContainerService.h | 4 +- src/windows/wslc/tasks/ContainerTasks.cpp | 7 +-- 4 files changed, 17 insertions(+), 64 deletions(-) diff --git a/src/windows/wslc/services/ConsoleService.cpp b/src/windows/wslc/services/ConsoleService.cpp index e066878d2..0f1f7aa36 100644 --- a/src/windows/wslc/services/ConsoleService.cpp +++ b/src/windows/wslc/services/ConsoleService.cpp @@ -21,59 +21,10 @@ using wsl::windows::common::ClientRunningWSLAProcess; using wsl::windows::common::relay::ReadHandle; using wsl::windows::common::relay::RelayHandle; -class ScopedCursorVisibility -{ -public: - ScopedCursorVisibility() - { - m_outputHandle.reset(CreateFileW( - L"CONOUT$", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, OPEN_EXISTING, 0, nullptr)); - - if (!m_outputHandle) - { - LOG_LAST_ERROR_MSG("CreateFileW(CONOUT$) failed"); - return; - } - - CONSOLE_CURSOR_INFO cursorInfo{}; - if (!GetConsoleCursorInfo(m_outputHandle.get(), &cursorInfo)) - { - LOG_LAST_ERROR_MSG("GetConsoleCursorInfo failed"); - return; - } - - m_savedCursorInfo = cursorInfo; - - if (!cursorInfo.bVisible) - { - cursorInfo.bVisible = TRUE; - LOG_IF_WIN32_BOOL_FALSE(SetConsoleCursorInfo(m_outputHandle.get(), &cursorInfo)); - } - } - - ~ScopedCursorVisibility() - { - if (m_outputHandle && m_savedCursorInfo.has_value()) - { - LOG_IF_WIN32_BOOL_FALSE(SetConsoleCursorInfo(m_outputHandle.get(), &m_savedCursorInfo.value())); - } - } - - ScopedCursorVisibility(const ScopedCursorVisibility&) = delete; - ScopedCursorVisibility& operator=(const ScopedCursorVisibility&) = delete; - ScopedCursorVisibility(ScopedCursorVisibility&&) = delete; - ScopedCursorVisibility& operator=(ScopedCursorVisibility&&) = delete; - -private: - wil::unique_hfile m_outputHandle; - std::optional m_savedCursorInfo{}; -}; - bool ConsoleService::RelayInteractiveTty(ClientRunningWSLAProcess& Process, HANDLE Tty, bool triggerRefresh) { // Configure console for interactive usage. wsl::windows::common::ConsoleState console; - ScopedCursorVisibility cursorVisibility; if (triggerRefresh) { diff --git a/src/windows/wslc/services/ContainerService.cpp b/src/windows/wslc/services/ContainerService.cpp index 898979681..b0900bafa 100644 --- a/src/windows/wslc/services/ContainerService.cpp +++ b/src/windows/wslc/services/ContainerService.cpp @@ -16,6 +16,7 @@ Module Name: #include "ContainerService.h" #include "ConsoleService.h" #include "ImageService.h" +#include "PullImageCallback.h" #include #include #include @@ -76,7 +77,7 @@ static void SetContainerArguments(WSLAProcessOptions& options, std::vector(), WideToMultiByte(context.Args.Get()), context.Data.Get(), &callback); + context.Data.Get(), WideToMultiByte(context.Args.Get()), context.Data.Get()); PrintMessage(MultiByteToWide(result.Id)); } @@ -176,9 +174,8 @@ void RunContainer(CLIExecutionContext& context) WI_ASSERT(context.Data.Contains(Data::Session)); WI_ASSERT(context.Args.Contains(ArgType::ImageId)); WI_ASSERT(context.Data.Contains(Data::ContainerOptions)); - PullImageCallback callback; context.ExitCode = ContainerService::Run( - context.Data.Get(), WideToMultiByte(context.Args.Get()), context.Data.Get(), &callback); + context.Data.Get(), WideToMultiByte(context.Args.Get()), context.Data.Get()); } void SetContainerOptionsFromArgs(CLIExecutionContext& context) From 781210b870e4ed5151c3c5a2b859211eb1dae86f Mon Sep 17 00:00:00 2001 From: AmirMS <104940545+AmelBawa-msft@users.noreply.github.com> Date: Mon, 23 Mar 2026 20:29:49 -0700 Subject: [PATCH 3/3] Clang format --- src/windows/wslc/services/ContainerService.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/windows/wslc/services/ContainerService.cpp b/src/windows/wslc/services/ContainerService.cpp index b0900bafa..e84dab472 100644 --- a/src/windows/wslc/services/ContainerService.cpp +++ b/src/windows/wslc/services/ContainerService.cpp @@ -76,8 +76,7 @@ static void SetContainerArguments(WSLAProcessOptions& options, std::vector(argsStorage.size())}; } -static wsl::windows::common::RunningWSLAContainer CreateInternal( - Session& session, const std::string& image, const ContainerOptions& options) +static wsl::windows::common::RunningWSLAContainer CreateInternal(Session& session, const std::string& image, const ContainerOptions& options) { auto processFlags = WSLAProcessFlagsNone; WI_SetFlagIf(processFlags, WSLAProcessFlagsStdin, options.Interactive);