diff --git a/doc/cascadia/profiles.schema.json b/doc/cascadia/profiles.schema.json index 6733fe52266..9593ab9f6a7 100644 --- a/doc/cascadia/profiles.schema.json +++ b/doc/cascadia/profiles.schema.json @@ -2777,10 +2777,6 @@ "description": "When set to true, prompts will automatically be marked.", "type": "boolean" }, - "experimental.connection.passthroughMode": { - "description": "When set to true, directs the PTY for this connection to use pass-through mode instead of the original Conhost PTY simulation engine. This is an experimental feature, and its continued existence is not guaranteed.", - "type": "boolean" - }, "experimental.retroTerminalEffect": { "description": "When set to true, enable retro terminal effects. This is an experimental feature, and its continued existence is not guaranteed.", "type": "boolean" diff --git a/src/cascadia/TerminalApp/TerminalPage.cpp b/src/cascadia/TerminalApp/TerminalPage.cpp index 605110a0ad7..d3fc7a2dc25 100644 --- a/src/cascadia/TerminalApp/TerminalPage.cpp +++ b/src/cascadia/TerminalApp/TerminalPage.cpp @@ -1277,11 +1277,6 @@ namespace winrt::TerminalApp::implementation } } - if constexpr (Feature_VtPassthroughMode::IsEnabled()) - { - valueSet.Insert(L"passthroughMode", Windows::Foundation::PropertyValue::CreateBoolean(settings.VtPassthrough())); - } - connection.Initialize(valueSet); TraceLoggingWrite( diff --git a/src/cascadia/TerminalConnection/ConptyConnection.cpp b/src/cascadia/TerminalConnection/ConptyConnection.cpp index 063083ace36..dd85388263b 100644 --- a/src/cascadia/TerminalConnection/ConptyConnection.cpp +++ b/src/cascadia/TerminalConnection/ConptyConnection.cpp @@ -257,10 +257,6 @@ namespace winrt::Microsoft::Terminal::TerminalConnection::implementation _cols = unbox_prop_or(settings, L"initialCols", _cols); _sessionId = unbox_prop_or(settings, L"sessionId", _sessionId); _environment = settings.TryLookup(L"environment").try_as(); - if constexpr (Feature_VtPassthroughMode::IsEnabled()) - { - _passthroughMode = unbox_prop_or(settings, L"passthroughMode", _passthroughMode); - } _inheritCursor = unbox_prop_or(settings, L"inheritCursor", _inheritCursor); _profileGuid = unbox_prop_or(settings, L"profileGuid", _profileGuid); @@ -332,14 +328,6 @@ namespace winrt::Microsoft::Terminal::TerminalConnection::implementation flags |= PSEUDOCONSOLE_INHERIT_CURSOR; } - if constexpr (Feature_VtPassthroughMode::IsEnabled()) - { - if (_passthroughMode) - { - WI_SetFlag(flags, PSEUDOCONSOLE_PASSTHROUGH_MODE); - } - } - THROW_IF_FAILED(_CreatePseudoConsoleAndPipes(til::unwrap_coord_size(dimensions), flags, &_inPipe, &_outPipe, &_hPC)); if (_initialParentHwnd != 0) diff --git a/src/cascadia/TerminalConnection/ConptyConnection.h b/src/cascadia/TerminalConnection/ConptyConnection.h index 2170b1fbfdf..e1b47bee64e 100644 --- a/src/cascadia/TerminalConnection/ConptyConnection.h +++ b/src/cascadia/TerminalConnection/ConptyConnection.h @@ -90,7 +90,6 @@ namespace winrt::Microsoft::Terminal::TerminalConnection::implementation til::u8state _u8State{}; std::wstring _u16Str{}; std::array _buffer{}; - bool _passthroughMode{}; bool _inheritCursor{ false }; til::env _initialEnv{}; diff --git a/src/cascadia/TerminalCore/ICoreSettings.idl b/src/cascadia/TerminalCore/ICoreSettings.idl index 1f3c78aa09b..ab3f0e5cf83 100644 --- a/src/cascadia/TerminalCore/ICoreSettings.idl +++ b/src/cascadia/TerminalCore/ICoreSettings.idl @@ -22,7 +22,6 @@ namespace Microsoft.Terminal.Core Boolean ForceVTInput; Boolean TrimBlockSelection; Boolean DetectURLs; - Boolean VtPassthrough; Windows.Foundation.IReference TabColor; Windows.Foundation.IReference StartingTabColor; diff --git a/src/cascadia/TerminalSettingsEditor/ProfileViewModel.cpp b/src/cascadia/TerminalSettingsEditor/ProfileViewModel.cpp index 75c201f76fd..a00a077ef5b 100644 --- a/src/cascadia/TerminalSettingsEditor/ProfileViewModel.cpp +++ b/src/cascadia/TerminalSettingsEditor/ProfileViewModel.cpp @@ -298,10 +298,6 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation return _unfocusedAppearanceViewModel; } - bool ProfileViewModel::VtPassthroughAvailable() const noexcept - { - return Feature_VtPassthroughMode::IsEnabled() && Feature_VtPassthroughModeSettingInUI::IsEnabled(); - } bool ProfileViewModel::ShowMarksAvailable() const noexcept { return Feature_ScrollbarMarks::IsEnabled(); diff --git a/src/cascadia/TerminalSettingsEditor/ProfileViewModel.h b/src/cascadia/TerminalSettingsEditor/ProfileViewModel.h index d3edd16dc48..3dd30223fe2 100644 --- a/src/cascadia/TerminalSettingsEditor/ProfileViewModel.h +++ b/src/cascadia/TerminalSettingsEditor/ProfileViewModel.h @@ -82,7 +82,6 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation void CreateUnfocusedAppearance(); void DeleteUnfocusedAppearance(); - bool VtPassthroughAvailable() const noexcept; bool ShowMarksAvailable() const noexcept; bool AutoMarkPromptsAvailable() const noexcept; bool RepositionCursorWithMouseAvailable() const noexcept; @@ -117,7 +116,6 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation OBSERVABLE_PROJECTED_SETTING(_profile, AltGrAliasing); OBSERVABLE_PROJECTED_SETTING(_profile, BellStyle); OBSERVABLE_PROJECTED_SETTING(_profile, Elevate); - OBSERVABLE_PROJECTED_SETTING(_profile, VtPassthrough); OBSERVABLE_PROJECTED_SETTING(_profile, ReloadEnvironmentVariables); OBSERVABLE_PROJECTED_SETTING(_profile, RightClickContextMenu); OBSERVABLE_PROJECTED_SETTING(_profile, ShowMarks); diff --git a/src/cascadia/TerminalSettingsEditor/ProfileViewModel.idl b/src/cascadia/TerminalSettingsEditor/ProfileViewModel.idl index 8dcd35f4bd9..135182a4fbf 100644 --- a/src/cascadia/TerminalSettingsEditor/ProfileViewModel.idl +++ b/src/cascadia/TerminalSettingsEditor/ProfileViewModel.idl @@ -75,7 +75,6 @@ namespace Microsoft.Terminal.Settings.Editor Boolean ShowUnfocusedAppearance { get; }; AppearanceViewModel UnfocusedAppearance { get; }; - Boolean VtPassthroughAvailable { get; }; Boolean ShowMarksAvailable { get; }; Boolean AutoMarkPromptsAvailable { get; }; Boolean RepositionCursorWithMouseAvailable { get; }; @@ -111,7 +110,6 @@ namespace Microsoft.Terminal.Settings.Editor OBSERVABLE_PROJECTED_PROFILE_SETTING(Boolean, AltGrAliasing); OBSERVABLE_PROJECTED_PROFILE_SETTING(Microsoft.Terminal.Settings.Model.BellStyle, BellStyle); OBSERVABLE_PROJECTED_PROFILE_SETTING(Boolean, Elevate); - OBSERVABLE_PROJECTED_PROFILE_SETTING(Boolean, VtPassthrough); OBSERVABLE_PROJECTED_PROFILE_SETTING(Boolean, ReloadEnvironmentVariables); OBSERVABLE_PROJECTED_PROFILE_SETTING(Boolean, RightClickContextMenu); OBSERVABLE_PROJECTED_PROFILE_SETTING(Boolean, ShowMarks); diff --git a/src/cascadia/TerminalSettingsEditor/Profiles_Advanced.xaml b/src/cascadia/TerminalSettingsEditor/Profiles_Advanced.xaml index f1e3832f85c..add8fb2cf77 100644 --- a/src/cascadia/TerminalSettingsEditor/Profiles_Advanced.xaml +++ b/src/cascadia/TerminalSettingsEditor/Profiles_Advanced.xaml @@ -117,16 +117,6 @@ - - - - - When enabled, the Terminal will generate a new environment block when creating new tabs or panes with this profile. When disabled, the tab/pane will instead inherit the variables the Terminal was started with. A description for what the "Reload environment variables" setting does. Presented near "Profile_ReloadEnvVars". - - Enable experimental virtual terminal passthrough - An option to enable experimental virtual terminal passthrough connectivity option with the underlying ConPTY - Display a menu on right-click This controls how a right-click behaves in the terminal diff --git a/src/cascadia/TerminalSettingsModel/MTSMSettings.h b/src/cascadia/TerminalSettingsModel/MTSMSettings.h index b4c678fd997..cde90f910b1 100644 --- a/src/cascadia/TerminalSettingsModel/MTSMSettings.h +++ b/src/cascadia/TerminalSettingsModel/MTSMSettings.h @@ -93,7 +93,6 @@ Author(s): X(bool, RightClickContextMenu, "experimental.rightClickContextMenu", false) \ X(Windows::Foundation::Collections::IVector, BellSound, "bellSound", nullptr) \ X(bool, Elevate, "elevate", false) \ - X(bool, VtPassthrough, "experimental.connection.passthroughMode", false) \ X(bool, AutoMarkPrompts, "experimental.autoMarkPrompts", false) \ X(bool, ShowMarks, "experimental.showMarksOnScrollbar", false) \ X(bool, RepositionCursorWithMouse, "experimental.repositionCursorWithMouse", false) \ diff --git a/src/cascadia/TerminalSettingsModel/Profile.idl b/src/cascadia/TerminalSettingsModel/Profile.idl index 9023fd16edb..2d6d1ab609c 100644 --- a/src/cascadia/TerminalSettingsModel/Profile.idl +++ b/src/cascadia/TerminalSettingsModel/Profile.idl @@ -59,7 +59,6 @@ namespace Microsoft.Terminal.Settings.Model INHERITABLE_PROFILE_SETTING(Microsoft.Terminal.Control.ScrollbarState, ScrollState); INHERITABLE_PROFILE_SETTING(String, Padding); INHERITABLE_PROFILE_SETTING(String, Commandline); - INHERITABLE_PROFILE_SETTING(Boolean, VtPassthrough); INHERITABLE_PROFILE_SETTING(String, StartingDirectory); String EvaluatedStartingDirectory { get; }; diff --git a/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp b/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp index 682d79e19c7..6f1d2932699 100644 --- a/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp +++ b/src/cascadia/TerminalSettingsModel/TerminalSettings.cpp @@ -297,7 +297,6 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation _Padding = profile.Padding(); _Commandline = profile.Commandline(); - _VtPassthrough = profile.VtPassthrough(); _StartingDirectory = profile.EvaluatedStartingDirectory(); diff --git a/src/cascadia/TerminalSettingsModel/TerminalSettings.h b/src/cascadia/TerminalSettingsModel/TerminalSettings.h index 99e3b2d120e..d3410ba2628 100644 --- a/src/cascadia/TerminalSettingsModel/TerminalSettings.h +++ b/src/cascadia/TerminalSettingsModel/TerminalSettings.h @@ -95,7 +95,6 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation INHERITABLE_SETTING(Model::TerminalSettings, bool, FocusFollowMouse, false); INHERITABLE_SETTING(Model::TerminalSettings, bool, TrimBlockSelection, true); INHERITABLE_SETTING(Model::TerminalSettings, bool, DetectURLs, true); - INHERITABLE_SETTING(Model::TerminalSettings, bool, VtPassthrough, false); INHERITABLE_SETTING(Model::TerminalSettings, Windows::Foundation::IReference, TabColor, nullptr); diff --git a/src/cascadia/inc/ControlProperties.h b/src/cascadia/inc/ControlProperties.h index faf5fc6a756..a882cd8b0cf 100644 --- a/src/cascadia/inc/ControlProperties.h +++ b/src/cascadia/inc/ControlProperties.h @@ -48,7 +48,6 @@ X(bool, ForceVTInput, false) \ X(winrt::hstring, StartingTitle) \ X(bool, DetectURLs, true) \ - X(bool, VtPassthrough, false) \ X(bool, AutoMarkPrompts) \ X(bool, RepositionCursorWithMouse, false) diff --git a/src/features.xml b/src/features.xml index 60191f62286..8fbf160a8c7 100644 --- a/src/features.xml +++ b/src/features.xml @@ -86,28 +86,6 @@ - - Feature_VtPassthroughMode - Enables passthrough option per profile in Terminal and ConPTY ability to use passthrough API dispatch engine - AlwaysDisabled - - - Dev - Canary - Preview - - - - - Feature_VtPassthroughModeSettingInUI - Enables the setting gated by Feature_VtPassthroughMode to appear in the UI - AlwaysDisabled - - Dev - - - - Feature_ScrollbarMarks Enables the experimental scrollbar marks feature. diff --git a/src/host/ConsoleArguments.cpp b/src/host/ConsoleArguments.cpp index 3621bca387f..6a22e8170a6 100644 --- a/src/host/ConsoleArguments.cpp +++ b/src/host/ConsoleArguments.cpp @@ -23,7 +23,6 @@ const std::wstring_view ConsoleArguments::RESIZE_QUIRK = L"--resizeQuirk"; const std::wstring_view ConsoleArguments::FEATURE_ARG = L"--feature"; const std::wstring_view ConsoleArguments::FEATURE_PTY_ARG = L"pty"; const std::wstring_view ConsoleArguments::COM_SERVER_ARG = L"-Embedding"; -const std::wstring_view ConsoleArguments::PASSTHROUGH_ARG = L"--passthrough"; // NOTE: Thinking about adding more commandline args that control conpty, for // the Terminal? Make sure you add them to the commandline in // ConsoleEstablishHandoff. We use that to initialize the ConsoleArguments for a @@ -467,12 +466,6 @@ void ConsoleArguments::s_ConsumeArg(_Inout_ std::vector& args, _In s_ConsumeArg(args, i); hr = S_OK; } - else if (arg == PASSTHROUGH_ARG) - { - _passthroughMode = true; - s_ConsumeArg(args, i); - hr = S_OK; - } else if (arg.substr(0, FILEPATH_LEADER_PREFIX.length()) == FILEPATH_LEADER_PREFIX) { // beginning of command line -- includes file path @@ -602,11 +595,6 @@ bool ConsoleArguments::ShouldRunAsComServer() const return _runAsComServer; } -bool ConsoleArguments::IsPassthroughMode() const noexcept -{ - return _passthroughMode; -} - HANDLE ConsoleArguments::GetServerHandle() const { return ULongToHandle(_serverHandle); diff --git a/src/host/ConsoleArguments.hpp b/src/host/ConsoleArguments.hpp index 8648c92ea66..926bc063924 100644 --- a/src/host/ConsoleArguments.hpp +++ b/src/host/ConsoleArguments.hpp @@ -36,7 +36,6 @@ class ConsoleArguments bool IsHeadless() const; bool ShouldCreateServerHandle() const; bool ShouldRunAsComServer() const; - bool IsPassthroughMode() const noexcept; HANDLE GetServerHandle() const; HANDLE GetVtInHandle() const; @@ -76,7 +75,6 @@ class ConsoleArguments static const std::wstring_view FEATURE_ARG; static const std::wstring_view FEATURE_PTY_ARG; static const std::wstring_view COM_SERVER_ARG; - static const std::wstring_view PASSTHROUGH_ARG; private: #ifdef UNIT_TESTING @@ -95,8 +93,7 @@ class ConsoleArguments const DWORD serverHandle, const DWORD signalHandle, const bool inheritCursor, - const bool runAsComServer, - const bool passthroughMode) : + const bool runAsComServer) : _commandline(commandline), _clientCommandline(clientCommandline), _vtInHandle(vtInHandle), @@ -112,8 +109,7 @@ class ConsoleArguments _signalHandle(signalHandle), _inheritCursor(inheritCursor), _resizeQuirk(false), - _runAsComServer{ runAsComServer }, - _passthroughMode{ passthroughMode } + _runAsComServer{ runAsComServer } { } #endif @@ -135,7 +131,6 @@ class ConsoleArguments short _width; short _height; - bool _passthroughMode{ false }; bool _runAsComServer; bool _createServerHandle; DWORD _serverHandle; @@ -191,7 +186,6 @@ namespace WEX L"Signal Handle: '0x%x'\r\n", L"Inherit Cursor: '%ws'\r\n", L"Run As Com Server: '%ws'\r\n", - L"Passthrough Mode: '%ws'\r\n", ci.GetClientCommandline().c_str(), s_ToBoolString(ci.HasVtHandles()), ci.GetVtInHandle(), @@ -206,8 +200,7 @@ namespace WEX s_ToBoolString(ci.HasSignalHandle()), ci.GetSignalHandle(), s_ToBoolString(ci.GetInheritCursor()), - s_ToBoolString(ci.ShouldRunAsComServer()), - s_ToBoolString(ci.IsPassthroughMode())); + s_ToBoolString(ci.ShouldRunAsComServer())); } private: @@ -237,8 +230,7 @@ namespace WEX expected.HasSignalHandle() == actual.HasSignalHandle() && expected.GetSignalHandle() == actual.GetSignalHandle() && expected.GetInheritCursor() == actual.GetInheritCursor() && - expected.ShouldRunAsComServer() == actual.ShouldRunAsComServer() && - expected.IsPassthroughMode() == actual.IsPassthroughMode(); + expected.ShouldRunAsComServer() == actual.ShouldRunAsComServer(); } static bool AreSame(const ConsoleArguments& expected, const ConsoleArguments& actual) @@ -264,8 +256,7 @@ namespace WEX object.GetServerHandle() == 0 && (object.GetSignalHandle() == 0 || object.GetSignalHandle() == INVALID_HANDLE_VALUE) && !object.GetInheritCursor() && - !object.ShouldRunAsComServer() && - !object.IsPassthroughMode(); + !object.ShouldRunAsComServer(); } }; } diff --git a/src/host/VtApiRoutines.cpp b/src/host/VtApiRoutines.cpp deleted file mode 100644 index fe7d0b7060e..00000000000 --- a/src/host/VtApiRoutines.cpp +++ /dev/null @@ -1,810 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -#include "precomp.h" -#include "VtApiRoutines.h" -#include "../interactivity/inc/ServiceLocator.hpp" -#include "../types/inc/convert.hpp" - -using namespace Microsoft::Console::Interactivity; - -// When someone attempts to use the console APIs to do a "read back" -// of the console buffer, we have to give them **something**. -// These two structures are just some gaudy-colored replacement character -// text to give them data but represent they've done something that cannot -// be supported under VT passthrough mode. -// ---- -// They can't be supported because in passthrough we maintain no internal -// buffer to answer these questions, and there is no VT sequence that lets -// us query the final terminal's buffer state. Even if a VT sequence did exist -// (and we personally believe it shouldn't), there's a possibility that it would -// read a massive amount of data and cause severe perf issues as applications coded -// to this old API are likely leaning on it heavily and asking for this data in a -// loop via VT would be a nightmare of parsing and formatting and over-the-wire transmission. - -static constexpr CHAR_INFO s_readBackUnicode{ - { UNICODE_REPLACEMENT }, - FOREGROUND_INTENSITY | FOREGROUND_RED | BACKGROUND_GREEN -}; - -static constexpr CHAR_INFO s_readBackAscii{ - { L'?' }, - FOREGROUND_INTENSITY | FOREGROUND_RED | BACKGROUND_GREEN -}; - -VtApiRoutines::VtApiRoutines() : - m_inputCodepage(ServiceLocator::LocateGlobals().getConsoleInformation().CP), - m_outputCodepage(ServiceLocator::LocateGlobals().getConsoleInformation().OutputCP), - m_inputMode(), - m_outputMode(), - m_pUsualRoutines(), - m_pVtEngine(), - m_listeningForDSR(false) -{ -} - -#pragma warning(push) -#pragma warning(disable : 4100) // unreferenced param - -void VtApiRoutines::GetConsoleInputCodePageImpl(ULONG& codepage) noexcept -{ - codepage = m_inputCodepage; - return; -} - -void VtApiRoutines::GetConsoleOutputCodePageImpl(ULONG& codepage) noexcept -{ - codepage = m_outputCodepage; - return; -} - -void VtApiRoutines::GetConsoleInputModeImpl(InputBuffer& context, - ULONG& mode) noexcept -{ - mode = m_inputMode; - return; -} - -void VtApiRoutines::GetConsoleOutputModeImpl(SCREEN_INFORMATION& context, - ULONG& mode) noexcept -{ - mode = m_outputMode; - return; -} - -[[nodiscard]] HRESULT VtApiRoutines::SetConsoleInputModeImpl(InputBuffer& context, - const ULONG mode) noexcept -{ - m_inputMode = mode; - return S_OK; -} - -[[nodiscard]] HRESULT VtApiRoutines::SetConsoleOutputModeImpl(SCREEN_INFORMATION& context, - const ULONG Mode) noexcept -{ - m_outputMode = Mode; - return S_OK; -} - -[[nodiscard]] HRESULT VtApiRoutines::GetNumberOfConsoleInputEventsImpl(const InputBuffer& context, - ULONG& events) noexcept -{ - return m_pUsualRoutines->GetNumberOfConsoleInputEventsImpl(context, events); -} - -void VtApiRoutines::_SynchronizeCursor(std::unique_ptr& waiter) noexcept -{ - // If we're about to tell the caller to wait, let's synchronize the cursor we have with what - // the terminal is presenting in case there's a cooked read going on. - // TODO GH#10001: we only need to do this in cooked read mode. - if (waiter) - { - m_listeningForDSR = true; - (void)m_pVtEngine->_ListenForDSR(); - (void)m_pVtEngine->RequestCursor(); - } -} - -[[nodiscard]] HRESULT VtApiRoutines::GetConsoleInputImpl( - IConsoleInputObject& context, - InputEventQueue& outEvents, - const size_t eventReadCount, - INPUT_READ_HANDLE_DATA& readHandleState, - const bool IsUnicode, - const bool IsPeek, - std::unique_ptr& waiter) noexcept -{ - const auto hr = m_pUsualRoutines->GetConsoleInputImpl(context, outEvents, eventReadCount, readHandleState, IsUnicode, IsPeek, waiter); - _SynchronizeCursor(waiter); - return hr; -} - -[[nodiscard]] HRESULT VtApiRoutines::ReadConsoleImpl(IConsoleInputObject& context, - std::span buffer, - size_t& written, - std::unique_ptr& waiter, - const std::wstring_view initialData, - const std::wstring_view exeName, - INPUT_READ_HANDLE_DATA& readHandleState, - const bool IsUnicode, - const HANDLE clientHandle, - const DWORD controlWakeupMask, - DWORD& controlKeyState) noexcept -{ - const auto hr = m_pUsualRoutines->ReadConsoleImpl(context, buffer, written, waiter, initialData, exeName, readHandleState, IsUnicode, clientHandle, controlWakeupMask, controlKeyState); - // If we're about to tell the caller to wait, let's synchronize the cursor we have with what - // the terminal is presenting in case there's a cooked read going on. - // TODO GH10001: we only need to do this in cooked read mode. - if (clientHandle) - { - m_listeningForDSR = true; - (void)m_pVtEngine->_ListenForDSR(); - (void)m_pVtEngine->RequestCursor(); - } - return hr; -} - -[[nodiscard]] HRESULT VtApiRoutines::WriteConsoleAImpl(IConsoleOutputObject& context, - const std::string_view buffer, - size_t& read, - bool requiresVtQuirk, - std::unique_ptr& waiter) noexcept -{ - if (CP_UTF8 == m_outputCodepage) - { - (void)m_pVtEngine->WriteTerminalUtf8(buffer); - } - else - { - (void)m_pVtEngine->WriteTerminalW(ConvertToW(m_outputCodepage, buffer)); - } - - (void)m_pVtEngine->_Flush(); - read = buffer.size(); - return S_OK; -} - -[[nodiscard]] HRESULT VtApiRoutines::WriteConsoleWImpl(IConsoleOutputObject& context, - const std::wstring_view buffer, - size_t& read, - bool requiresVtQuirk, - std::unique_ptr& waiter) noexcept -{ - (void)m_pVtEngine->WriteTerminalW(buffer); - (void)m_pVtEngine->_Flush(); - read = buffer.size(); - return S_OK; -} - -[[nodiscard]] HRESULT VtApiRoutines::GetConsoleLangIdImpl(LANGID& langId) noexcept -{ - return m_pUsualRoutines->GetConsoleLangIdImpl(langId); -} - -[[nodiscard]] HRESULT VtApiRoutines::FillConsoleOutputAttributeImpl(IConsoleOutputObject& OutContext, - const WORD attribute, - const size_t lengthToWrite, - const til::point startingCoordinate, - size_t& cellsModified) noexcept -{ - (void)m_pVtEngine->_CursorPosition(startingCoordinate); - (void)m_pVtEngine->_SetGraphicsRendition16Color(static_cast(attribute), true); - (void)m_pVtEngine->_SetGraphicsRendition16Color(static_cast(attribute >> 4), false); - (void)m_pVtEngine->_WriteFill(lengthToWrite, s_readBackAscii.Char.AsciiChar); - (void)m_pVtEngine->_Flush(); - cellsModified = lengthToWrite; - return S_OK; -} - -[[nodiscard]] HRESULT VtApiRoutines::FillConsoleOutputCharacterAImpl(IConsoleOutputObject& OutContext, - const char character, - const size_t lengthToWrite, - const til::point startingCoordinate, - size_t& cellsModified) noexcept -{ - // I mean... if you get your jollies by using UTF8 for single byte codepoints... - // we may as well skip a lot of conversion work and just write it out. - if (m_outputCodepage == CP_UTF8 && character <= 0x7F) - { - (void)m_pVtEngine->_CursorPosition(startingCoordinate); - (void)m_pVtEngine->_WriteFill(lengthToWrite, character); - (void)m_pVtEngine->_Flush(); - cellsModified = lengthToWrite; - return S_OK; - } - else - { - const auto wstr = ConvertToW(m_outputCodepage, std::string_view{ &character, 1 }); - return FillConsoleOutputCharacterWImpl(OutContext, wstr.front(), lengthToWrite, startingCoordinate, cellsModified); - } -} - -[[nodiscard]] HRESULT VtApiRoutines::FillConsoleOutputCharacterWImpl(IConsoleOutputObject& OutContext, - const wchar_t character, - const size_t lengthToWrite, - const til::point startingCoordinate, - size_t& cellsModified, - const bool enablePowershellShim) noexcept -{ - (void)m_pVtEngine->_CursorPosition(startingCoordinate); - const std::wstring_view sv{ &character, 1 }; - - // TODO GH10001: horrible. it'll WC2MB over and over...we should do that once then emit... and then rep... - // TODO GH10001: there's probably an optimization for if ((character & 0x7F) == character) --> call the UTF8 one. - for (size_t i = 0; i < lengthToWrite; ++i) - { - (void)m_pVtEngine->WriteTerminalW(sv); - } - - (void)m_pVtEngine->_Flush(); - cellsModified = lengthToWrite; - return S_OK; -} - -//// Process based. Restrict in protocol side? -//HRESULT GenerateConsoleCtrlEventImpl(const ULONG ProcessGroupFilter, -// const ULONG ControlEvent); - -void VtApiRoutines::SetConsoleActiveScreenBufferImpl(SCREEN_INFORMATION& newContext) noexcept -{ - return; -} - -void VtApiRoutines::FlushConsoleInputBuffer(InputBuffer& context) noexcept -{ - m_pUsualRoutines->FlushConsoleInputBuffer(context); -} - -[[nodiscard]] HRESULT VtApiRoutines::SetConsoleInputCodePageImpl(const ULONG codepage) noexcept -{ - m_inputCodepage = codepage; - return S_OK; -} - -[[nodiscard]] HRESULT VtApiRoutines::SetConsoleOutputCodePageImpl(const ULONG codepage) noexcept -{ - m_outputCodepage = codepage; - return S_OK; -} - -void VtApiRoutines::GetConsoleCursorInfoImpl(const SCREEN_INFORMATION& context, - ULONG& size, - bool& isVisible) noexcept -{ - // TODO GH10001: good luck capturing this out of the input buffer when it comes back in. - //m_pVtEngine->RequestCursor(); - return; -} - -[[nodiscard]] HRESULT VtApiRoutines::SetConsoleCursorInfoImpl(SCREEN_INFORMATION& context, - const ULONG size, - const bool isVisible) noexcept -{ - isVisible ? (void)m_pVtEngine->_ShowCursor() : (void)m_pVtEngine->_HideCursor(); - (void)m_pVtEngine->_Flush(); - return S_OK; -} - -//// driver will pare down for non-Ex method -void VtApiRoutines::GetConsoleScreenBufferInfoExImpl(const SCREEN_INFORMATION& context, - CONSOLE_SCREEN_BUFFER_INFOEX& data) noexcept -{ - // TODO GH10001: this is technically full of potentially incorrect data. do we care? should we store it in here with set? - return m_pUsualRoutines->GetConsoleScreenBufferInfoExImpl(context, data); -} - -[[nodiscard]] HRESULT VtApiRoutines::SetConsoleScreenBufferInfoExImpl(SCREEN_INFORMATION& context, - const CONSOLE_SCREEN_BUFFER_INFOEX& data) noexcept -{ - (void)m_pVtEngine->_ResizeWindow(data.srWindow.Right - data.srWindow.Left, data.srWindow.Bottom - data.srWindow.Top); - (void)m_pVtEngine->_CursorPosition(til::wrap_coord(data.dwCursorPosition)); - (void)m_pVtEngine->_SetGraphicsRendition16Color(static_cast(data.wAttributes), true); - (void)m_pVtEngine->_SetGraphicsRendition16Color(static_cast(data.wAttributes >> 4), false); - //color table? - // popup attributes... hold internally? - // TODO GH10001: popups are gonna erase the stuff behind them... deal with that somehow. - (void)m_pVtEngine->_Flush(); - return S_OK; -} - -[[nodiscard]] HRESULT VtApiRoutines::SetConsoleScreenBufferSizeImpl(SCREEN_INFORMATION& context, - const til::size size) noexcept -{ - // Don't transmit. The terminal figures out its own buffer size. - return S_OK; -} - -[[nodiscard]] HRESULT VtApiRoutines::SetConsoleCursorPositionImpl(SCREEN_INFORMATION& context, - const til::point position) noexcept -{ - if (m_listeningForDSR) - { - context.GetActiveBuffer().GetTextBuffer().GetCursor().SetPosition(position); - m_pVtEngine->SetTerminalCursorTextPosition(position); - } - else - { - (void)m_pVtEngine->_CursorPosition(position); - (void)m_pVtEngine->_Flush(); - } - return S_OK; -} - -void VtApiRoutines::GetLargestConsoleWindowSizeImpl(const SCREEN_INFORMATION& context, - til::size& size) noexcept -{ - m_pUsualRoutines->GetLargestConsoleWindowSizeImpl(context, size); // This is likely super weird but not weirder than existing ConPTY answers. - return; -} - -[[nodiscard]] HRESULT VtApiRoutines::ScrollConsoleScreenBufferAImpl(SCREEN_INFORMATION& context, - const til::inclusive_rect& source, - const til::point target, - std::optional clip, - const char fillCharacter, - const WORD fillAttribute) noexcept -{ - // TODO GH10001: Use DECCRA - return S_OK; -} - -[[nodiscard]] HRESULT VtApiRoutines::ScrollConsoleScreenBufferWImpl(SCREEN_INFORMATION& context, - const til::inclusive_rect& source, - const til::point target, - std::optional clip, - const wchar_t fillCharacter, - const WORD fillAttribute, - const bool enableCmdShim) noexcept -{ - // TODO GH10001: Use DECCRA - return S_OK; -} - -[[nodiscard]] HRESULT VtApiRoutines::SetConsoleTextAttributeImpl(SCREEN_INFORMATION& context, - const WORD attribute) noexcept -{ - (void)m_pVtEngine->_SetGraphicsRendition16Color(static_cast(attribute), true); - (void)m_pVtEngine->_SetGraphicsRendition16Color(static_cast(attribute >> 4), false); - (void)m_pVtEngine->_Flush(); - return S_OK; -} - -[[nodiscard]] HRESULT VtApiRoutines::SetConsoleWindowInfoImpl(SCREEN_INFORMATION& context, - const bool isAbsolute, - const til::inclusive_rect& windowRect) noexcept -{ - (void)m_pVtEngine->_ResizeWindow(windowRect.right - windowRect.left + 1, windowRect.bottom - windowRect.top + 1); - (void)m_pVtEngine->_Flush(); - return S_OK; -} - -[[nodiscard]] HRESULT VtApiRoutines::ReadConsoleOutputAttributeImpl(const SCREEN_INFORMATION& context, - const til::point origin, - std::span buffer, - size_t& written) noexcept -{ - std::fill_n(buffer.data(), buffer.size(), s_readBackUnicode.Attributes); // should be same as the ascii one. - written = buffer.size(); - return S_OK; -} - -[[nodiscard]] HRESULT VtApiRoutines::ReadConsoleOutputCharacterAImpl(const SCREEN_INFORMATION& context, - const til::point origin, - std::span buffer, - size_t& written) noexcept -{ - std::fill_n(buffer.data(), buffer.size(), s_readBackAscii.Char.AsciiChar); - written = buffer.size(); - return S_OK; -} - -[[nodiscard]] HRESULT VtApiRoutines::ReadConsoleOutputCharacterWImpl(const SCREEN_INFORMATION& context, - const til::point origin, - std::span buffer, - size_t& written) noexcept -{ - std::fill_n(buffer.data(), buffer.size(), s_readBackUnicode.Char.UnicodeChar); - written = buffer.size(); - return S_OK; -} - -[[nodiscard]] HRESULT VtApiRoutines::WriteConsoleInputAImpl(InputBuffer& context, - const std::span buffer, - size_t& written, - const bool append) noexcept -{ - return m_pUsualRoutines->WriteConsoleInputAImpl(context, buffer, written, append); -} - -[[nodiscard]] HRESULT VtApiRoutines::WriteConsoleInputWImpl(InputBuffer& context, - const std::span buffer, - size_t& written, - const bool append) noexcept -{ - return m_pUsualRoutines->WriteConsoleInputWImpl(context, buffer, written, append); -} - -extern HRESULT _ConvertCellsToWInplace(const UINT codepage, - std::span buffer, - const Viewport& rectangle) noexcept; - -[[nodiscard]] HRESULT VtApiRoutines::WriteConsoleOutputAImpl(SCREEN_INFORMATION& context, - std::span buffer, - const Microsoft::Console::Types::Viewport& requestRectangle, - Microsoft::Console::Types::Viewport& writtenRectangle) noexcept -{ - // No UTF8 optimization because the entire `CHAR_INFO` grid system doesn't make sense for UTF-8 - // with up to 4 bytes per cell...or more! - - RETURN_IF_FAILED(_ConvertCellsToWInplace(m_outputCodepage, buffer, requestRectangle)); - return WriteConsoleOutputWImpl(context, buffer, requestRectangle, writtenRectangle); -} - -[[nodiscard]] HRESULT VtApiRoutines::WriteConsoleOutputWImpl(SCREEN_INFORMATION& context, - std::span buffer, - const Microsoft::Console::Types::Viewport& requestRectangle, - Microsoft::Console::Types::Viewport& writtenRectangle) noexcept -{ - auto cursor = requestRectangle.Origin(); - - const size_t width = requestRectangle.Width(); - size_t pos = 0; - - while (pos < buffer.size()) - { - (void)m_pVtEngine->_CursorPosition(cursor); - - const auto subspan = buffer.subspan(pos, width); - - for (const auto& ci : subspan) - { - (void)m_pVtEngine->_SetGraphicsRendition16Color(static_cast(ci.Attributes), true); - (void)m_pVtEngine->_SetGraphicsRendition16Color(static_cast(ci.Attributes >> 4), false); - (void)m_pVtEngine->WriteTerminalW(std::wstring_view{ &ci.Char.UnicodeChar, 1 }); - } - - ++cursor.y; - pos += width; - } - - (void)m_pVtEngine->_Flush(); - - //TODO GH10001: trim to buffer size? - writtenRectangle = requestRectangle; - return S_OK; -} - -[[nodiscard]] HRESULT VtApiRoutines::WriteConsoleOutputAttributeImpl(IConsoleOutputObject& OutContext, - const std::span attrs, - const til::point target, - size_t& used) noexcept -{ - (void)m_pVtEngine->_CursorPosition(target); - - for (const auto& attr : attrs) - { - (void)m_pVtEngine->_SetGraphicsRendition16Color(static_cast(attr), true); - (void)m_pVtEngine->_SetGraphicsRendition16Color(static_cast(attr >> 4), false); - (void)m_pVtEngine->WriteTerminalUtf8(std::string_view{ &s_readBackAscii.Char.AsciiChar, 1 }); - } - - (void)m_pVtEngine->_Flush(); - - used = attrs.size(); - return S_OK; -} - -[[nodiscard]] HRESULT VtApiRoutines::WriteConsoleOutputCharacterAImpl(IConsoleOutputObject& OutContext, - const std::string_view text, - const til::point target, - size_t& used) noexcept -{ - if (m_outputCodepage == CP_UTF8) - { - (void)m_pVtEngine->_CursorPosition(target); - (void)m_pVtEngine->WriteTerminalUtf8(text); - (void)m_pVtEngine->_Flush(); - return S_OK; - } - else - { - return WriteConsoleOutputCharacterWImpl(OutContext, ConvertToW(m_outputCodepage, text), target, used); - } -} - -[[nodiscard]] HRESULT VtApiRoutines::WriteConsoleOutputCharacterWImpl(IConsoleOutputObject& OutContext, - const std::wstring_view text, - const til::point target, - size_t& used) noexcept -{ - (void)m_pVtEngine->_CursorPosition(target); - (void)m_pVtEngine->WriteTerminalW(text); - (void)m_pVtEngine->_Flush(); - return S_OK; -} - -[[nodiscard]] HRESULT VtApiRoutines::ReadConsoleOutputAImpl(const SCREEN_INFORMATION& context, - std::span buffer, - const Microsoft::Console::Types::Viewport& sourceRectangle, - Microsoft::Console::Types::Viewport& readRectangle) noexcept -{ - std::fill_n(buffer.data(), buffer.size(), s_readBackAscii); - // TODO GH10001: do we need to constrict readRectangle to within the known buffer size... probably. - return S_OK; -} - -[[nodiscard]] HRESULT VtApiRoutines::ReadConsoleOutputWImpl(const SCREEN_INFORMATION& context, - std::span buffer, - const Microsoft::Console::Types::Viewport& sourceRectangle, - Microsoft::Console::Types::Viewport& readRectangle) noexcept -{ - std::fill_n(buffer.data(), buffer.size(), s_readBackUnicode); - // TODO GH10001: do we need to constrict readRectangle to within the known buffer size... probably. - return S_OK; -} - -[[nodiscard]] HRESULT VtApiRoutines::GetConsoleTitleAImpl(std::span title, - size_t& written, - size_t& needed) noexcept -{ - written = 0; - needed = 0; - - if (!title.empty()) - { - title.front() = ANSI_NULL; - } - - return S_OK; -} - -[[nodiscard]] HRESULT VtApiRoutines::GetConsoleTitleWImpl(std::span title, - size_t& written, - size_t& needed) noexcept -{ - written = 0; - needed = 0; - - if (!title.empty()) - { - title.front() = UNICODE_NULL; - } - - return S_OK; -} - -[[nodiscard]] HRESULT VtApiRoutines::GetConsoleOriginalTitleAImpl(std::span title, - size_t& written, - size_t& needed) noexcept -{ - written = 0; - needed = 0; - - if (!title.empty()) - { - title.front() = ANSI_NULL; - } - - return S_OK; -} - -[[nodiscard]] HRESULT VtApiRoutines::GetConsoleOriginalTitleWImpl(std::span title, - size_t& written, - size_t& needed) noexcept -{ - written = 0; - needed = 0; - - if (!title.empty()) - { - title.front() = UNICODE_NULL; - } - - return S_OK; -} - -[[nodiscard]] HRESULT VtApiRoutines::SetConsoleTitleAImpl(const std::string_view title) noexcept -{ - return SetConsoleTitleWImpl(ConvertToW(m_inputCodepage, title)); -} - -[[nodiscard]] HRESULT VtApiRoutines::SetConsoleTitleWImpl(const std::wstring_view title) noexcept -{ - (void)m_pVtEngine->UpdateTitle(title); - (void)m_pVtEngine->_Flush(); - return S_OK; -} - -void VtApiRoutines::GetNumberOfConsoleMouseButtonsImpl(ULONG& buttons) noexcept -{ - buttons = 2; - return; -} - -[[nodiscard]] HRESULT VtApiRoutines::GetConsoleFontSizeImpl(const SCREEN_INFORMATION& context, - const DWORD index, - til::size& size) noexcept -{ - size.width = 8; - size.height = 12; - return S_OK; -} - -//// driver will pare down for non-Ex method -[[nodiscard]] HRESULT VtApiRoutines::GetCurrentConsoleFontExImpl(const SCREEN_INFORMATION& context, - const bool isForMaximumWindowSize, - CONSOLE_FONT_INFOEX& consoleFontInfoEx) noexcept -{ - return S_OK; -} - -[[nodiscard]] HRESULT VtApiRoutines::SetConsoleDisplayModeImpl(SCREEN_INFORMATION& context, - const ULONG flags, - til::size& newSize) noexcept -{ - return S_OK; -} - -void VtApiRoutines::GetConsoleDisplayModeImpl(ULONG& flags) noexcept -{ - flags = 0; - return; -} - -[[nodiscard]] HRESULT VtApiRoutines::AddConsoleAliasAImpl(const std::string_view source, - const std::string_view target, - const std::string_view exeName) noexcept -{ - return m_pUsualRoutines->AddConsoleAliasAImpl(source, target, exeName); -} - -[[nodiscard]] HRESULT VtApiRoutines::AddConsoleAliasWImpl(const std::wstring_view source, - const std::wstring_view target, - const std::wstring_view exeName) noexcept -{ - return m_pUsualRoutines->AddConsoleAliasWImpl(source, target, exeName); -} - -[[nodiscard]] HRESULT VtApiRoutines::GetConsoleAliasAImpl(const std::string_view source, - std::span target, - size_t& written, - const std::string_view exeName) noexcept -{ - return m_pUsualRoutines->GetConsoleAliasAImpl(source, target, written, exeName); -} - -[[nodiscard]] HRESULT VtApiRoutines::GetConsoleAliasWImpl(const std::wstring_view source, - std::span target, - size_t& written, - const std::wstring_view exeName) noexcept -{ - return m_pUsualRoutines->GetConsoleAliasWImpl(source, target, written, exeName); -} - -[[nodiscard]] HRESULT VtApiRoutines::GetConsoleAliasesLengthAImpl(const std::string_view exeName, - size_t& bufferRequired) noexcept -{ - return m_pUsualRoutines->GetConsoleAliasesLengthAImpl(exeName, bufferRequired); -} - -[[nodiscard]] HRESULT VtApiRoutines::GetConsoleAliasesLengthWImpl(const std::wstring_view exeName, - size_t& bufferRequired) noexcept -{ - return m_pUsualRoutines->GetConsoleAliasesLengthWImpl(exeName, bufferRequired); -} - -[[nodiscard]] HRESULT VtApiRoutines::GetConsoleAliasExesLengthAImpl(size_t& bufferRequired) noexcept -{ - return m_pUsualRoutines->GetConsoleAliasExesLengthAImpl(bufferRequired); -} - -[[nodiscard]] HRESULT VtApiRoutines::GetConsoleAliasExesLengthWImpl(size_t& bufferRequired) noexcept -{ - return m_pUsualRoutines->GetConsoleAliasExesLengthWImpl(bufferRequired); -} - -[[nodiscard]] HRESULT VtApiRoutines::GetConsoleAliasesAImpl(const std::string_view exeName, - std::span alias, - size_t& written) noexcept -{ - return m_pUsualRoutines->GetConsoleAliasesAImpl(exeName, alias, written); -} - -[[nodiscard]] HRESULT VtApiRoutines::GetConsoleAliasesWImpl(const std::wstring_view exeName, - std::span alias, - size_t& written) noexcept -{ - return m_pUsualRoutines->GetConsoleAliasesWImpl(exeName, alias, written); -} - -[[nodiscard]] HRESULT VtApiRoutines::GetConsoleAliasExesAImpl(std::span aliasExes, - size_t& written) noexcept -{ - return m_pUsualRoutines->GetConsoleAliasExesAImpl(aliasExes, written); -} - -[[nodiscard]] HRESULT VtApiRoutines::GetConsoleAliasExesWImpl(std::span aliasExes, - size_t& written) noexcept -{ - return m_pUsualRoutines->GetConsoleAliasExesWImpl(aliasExes, written); -} - -[[nodiscard]] HRESULT VtApiRoutines::ExpungeConsoleCommandHistoryAImpl(const std::string_view exeName) noexcept -{ - return m_pUsualRoutines->ExpungeConsoleCommandHistoryAImpl(exeName); -} - -[[nodiscard]] HRESULT VtApiRoutines::ExpungeConsoleCommandHistoryWImpl(const std::wstring_view exeName) noexcept -{ - return m_pUsualRoutines->ExpungeConsoleCommandHistoryWImpl(exeName); -} - -[[nodiscard]] HRESULT VtApiRoutines::SetConsoleNumberOfCommandsAImpl(const std::string_view exeName, - const size_t numberOfCommands) noexcept -{ - return m_pUsualRoutines->SetConsoleNumberOfCommandsAImpl(exeName, numberOfCommands); -} - -[[nodiscard]] HRESULT VtApiRoutines::SetConsoleNumberOfCommandsWImpl(const std::wstring_view exeName, - const size_t numberOfCommands) noexcept -{ - return m_pUsualRoutines->SetConsoleNumberOfCommandsWImpl(exeName, numberOfCommands); -} - -[[nodiscard]] HRESULT VtApiRoutines::GetConsoleCommandHistoryLengthAImpl(const std::string_view exeName, - size_t& length) noexcept -{ - return m_pUsualRoutines->GetConsoleCommandHistoryLengthAImpl(exeName, length); -} - -[[nodiscard]] HRESULT VtApiRoutines::GetConsoleCommandHistoryLengthWImpl(const std::wstring_view exeName, - size_t& length) noexcept -{ - return m_pUsualRoutines->GetConsoleCommandHistoryLengthWImpl(exeName, length); -} - -[[nodiscard]] HRESULT VtApiRoutines::GetConsoleCommandHistoryAImpl(const std::string_view exeName, - std::span commandHistory, - size_t& written) noexcept -{ - return m_pUsualRoutines->GetConsoleCommandHistoryAImpl(exeName, commandHistory, written); -} - -[[nodiscard]] HRESULT VtApiRoutines::GetConsoleCommandHistoryWImpl(const std::wstring_view exeName, - std::span commandHistory, - size_t& written) noexcept -{ - return m_pUsualRoutines->GetConsoleCommandHistoryWImpl(exeName, commandHistory, written); -} - -void VtApiRoutines::GetConsoleWindowImpl(HWND& hwnd) noexcept -{ - hwnd = ServiceLocator::LocatePseudoWindow(); - return; -} - -void VtApiRoutines::GetConsoleSelectionInfoImpl(CONSOLE_SELECTION_INFO& consoleSelectionInfo) noexcept -{ - consoleSelectionInfo = { 0 }; - return; -} - -void VtApiRoutines::GetConsoleHistoryInfoImpl(CONSOLE_HISTORY_INFO& consoleHistoryInfo) noexcept -{ - m_pUsualRoutines->GetConsoleHistoryInfoImpl(consoleHistoryInfo); - return; -} - -[[nodiscard]] HRESULT VtApiRoutines::SetConsoleHistoryInfoImpl(const CONSOLE_HISTORY_INFO& consoleHistoryInfo) noexcept -{ - return m_pUsualRoutines->SetConsoleHistoryInfoImpl(consoleHistoryInfo); -} - -[[nodiscard]] HRESULT VtApiRoutines::SetCurrentConsoleFontExImpl(IConsoleOutputObject& context, - const bool isForMaximumWindowSize, - const CONSOLE_FONT_INFOEX& consoleFontInfoEx) noexcept -{ - return S_OK; -} - -#pragma warning(pop) diff --git a/src/host/VtApiRoutines.h b/src/host/VtApiRoutines.h deleted file mode 100644 index 7dc77f78b09..00000000000 --- a/src/host/VtApiRoutines.h +++ /dev/null @@ -1,366 +0,0 @@ -/*++ -Copyright (c) Microsoft Corporation -Licensed under the MIT license. - -Module Name: -- VtApiRoutines.h - -Abstract: -- This file defines the interface to respond to all API calls by using VT on behalf of the client - -Author: -- Michael Niksa (miniksa) 26-Jul-2021 - -Revision History: -- Adapted from original items in srvinit.cpp, getset.cpp, directio.cpp, stream.cpp ---*/ - -#pragma once - -#include "../server/IApiRoutines.h" -#include "../renderer/vt/Xterm256Engine.hpp" - -class VtApiRoutines : public IApiRoutines -{ -public: - VtApiRoutines(); - -#pragma region ObjectManagement - /*HRESULT CreateInitialObjects(_Out_ InputBuffer** const ppInputObject, - _Out_ SCREEN_INFORMATION** const ppOutputObject); - */ - -#pragma endregion - -#pragma region L1 - void GetConsoleInputCodePageImpl(ULONG& codepage) noexcept override; - - void GetConsoleOutputCodePageImpl(ULONG& codepage) noexcept override; - - void GetConsoleInputModeImpl(InputBuffer& context, - ULONG& mode) noexcept override; - - void GetConsoleOutputModeImpl(SCREEN_INFORMATION& context, - ULONG& mode) noexcept override; - - [[nodiscard]] HRESULT SetConsoleInputModeImpl(InputBuffer& context, - const ULONG mode) noexcept override; - - [[nodiscard]] HRESULT SetConsoleOutputModeImpl(SCREEN_INFORMATION& context, - const ULONG Mode) noexcept override; - - [[nodiscard]] HRESULT GetNumberOfConsoleInputEventsImpl(const InputBuffer& context, - ULONG& events) noexcept override; - - [[nodiscard]] HRESULT GetConsoleInputImpl(IConsoleInputObject& context, - InputEventQueue& outEvents, - const size_t eventReadCount, - INPUT_READ_HANDLE_DATA& readHandleState, - const bool IsUnicode, - const bool IsPeek, - std::unique_ptr& waiter) noexcept override; - - [[nodiscard]] HRESULT ReadConsoleImpl(IConsoleInputObject& context, - std::span buffer, - size_t& written, - std::unique_ptr& waiter, - const std::wstring_view initialData, - const std::wstring_view exeName, - INPUT_READ_HANDLE_DATA& readHandleState, - const bool IsUnicode, - const HANDLE clientHandle, - const DWORD controlWakeupMask, - DWORD& controlKeyState) noexcept override; - - [[nodiscard]] HRESULT WriteConsoleAImpl(IConsoleOutputObject& context, - const std::string_view buffer, - size_t& read, - bool requiresVtQuirk, - std::unique_ptr& waiter) noexcept override; - - [[nodiscard]] HRESULT WriteConsoleWImpl(IConsoleOutputObject& context, - const std::wstring_view buffer, - size_t& read, - bool requiresVtQuirk, - std::unique_ptr& waiter) noexcept override; - -#pragma region ThreadCreationInfo - [[nodiscard]] HRESULT GetConsoleLangIdImpl(LANGID& langId) noexcept override; -#pragma endregion - -#pragma endregion - -#pragma region L2 - - [[nodiscard]] HRESULT FillConsoleOutputAttributeImpl(IConsoleOutputObject& OutContext, - const WORD attribute, - const size_t lengthToWrite, - const til::point startingCoordinate, - size_t& cellsModified) noexcept override; - - [[nodiscard]] HRESULT FillConsoleOutputCharacterAImpl(IConsoleOutputObject& OutContext, - const char character, - const size_t lengthToWrite, - const til::point startingCoordinate, - size_t& cellsModified) noexcept override; - - [[nodiscard]] HRESULT FillConsoleOutputCharacterWImpl(IConsoleOutputObject& OutContext, - const wchar_t character, - const size_t lengthToWrite, - const til::point startingCoordinate, - size_t& cellsModified, - const bool enablePowershellShim = false) noexcept override; - - //// Process based. Restrict in protocol side? - //HRESULT GenerateConsoleCtrlEventImpl(const ULONG ProcessGroupFilter, - // const ULONG ControlEvent); - - void SetConsoleActiveScreenBufferImpl(SCREEN_INFORMATION& newContext) noexcept override; - - void FlushConsoleInputBuffer(InputBuffer& context) noexcept override; - - [[nodiscard]] HRESULT SetConsoleInputCodePageImpl(const ULONG codepage) noexcept override; - - [[nodiscard]] HRESULT SetConsoleOutputCodePageImpl(const ULONG codepage) noexcept override; - - void GetConsoleCursorInfoImpl(const SCREEN_INFORMATION& context, - ULONG& size, - bool& isVisible) noexcept override; - - [[nodiscard]] HRESULT SetConsoleCursorInfoImpl(SCREEN_INFORMATION& context, - const ULONG size, - const bool isVisible) noexcept override; - - //// driver will pare down for non-Ex method - void GetConsoleScreenBufferInfoExImpl(const SCREEN_INFORMATION& context, - CONSOLE_SCREEN_BUFFER_INFOEX& data) noexcept override; - - [[nodiscard]] HRESULT SetConsoleScreenBufferInfoExImpl(SCREEN_INFORMATION& context, - const CONSOLE_SCREEN_BUFFER_INFOEX& data) noexcept override; - - [[nodiscard]] HRESULT SetConsoleScreenBufferSizeImpl(SCREEN_INFORMATION& context, - const til::size size) noexcept override; - - [[nodiscard]] HRESULT SetConsoleCursorPositionImpl(SCREEN_INFORMATION& context, - const til::point position) noexcept override; - - void GetLargestConsoleWindowSizeImpl(const SCREEN_INFORMATION& context, - til::size& size) noexcept override; - - [[nodiscard]] HRESULT ScrollConsoleScreenBufferAImpl(SCREEN_INFORMATION& context, - const til::inclusive_rect& source, - const til::point target, - std::optional clip, - const char fillCharacter, - const WORD fillAttribute) noexcept override; - - [[nodiscard]] HRESULT ScrollConsoleScreenBufferWImpl(SCREEN_INFORMATION& context, - const til::inclusive_rect& source, - const til::point target, - std::optional clip, - const wchar_t fillCharacter, - const WORD fillAttribute, - const bool enableCmdShim = false) noexcept override; - - [[nodiscard]] HRESULT SetConsoleTextAttributeImpl(SCREEN_INFORMATION& context, - const WORD attribute) noexcept override; - - [[nodiscard]] HRESULT SetConsoleWindowInfoImpl(SCREEN_INFORMATION& context, - const bool isAbsolute, - const til::inclusive_rect& windowRect) noexcept override; - - [[nodiscard]] HRESULT ReadConsoleOutputAttributeImpl(const SCREEN_INFORMATION& context, - const til::point origin, - std::span buffer, - size_t& written) noexcept override; - - [[nodiscard]] HRESULT ReadConsoleOutputCharacterAImpl(const SCREEN_INFORMATION& context, - const til::point origin, - std::span buffer, - size_t& written) noexcept override; - - [[nodiscard]] HRESULT ReadConsoleOutputCharacterWImpl(const SCREEN_INFORMATION& context, - const til::point origin, - std::span buffer, - size_t& written) noexcept override; - - [[nodiscard]] HRESULT WriteConsoleInputAImpl(InputBuffer& context, - const std::span buffer, - size_t& written, - const bool append) noexcept override; - - [[nodiscard]] HRESULT WriteConsoleInputWImpl(InputBuffer& context, - const std::span buffer, - size_t& written, - const bool append) noexcept override; - - [[nodiscard]] HRESULT WriteConsoleOutputAImpl(SCREEN_INFORMATION& context, - std::span buffer, - const Microsoft::Console::Types::Viewport& requestRectangle, - Microsoft::Console::Types::Viewport& writtenRectangle) noexcept override; - - [[nodiscard]] HRESULT WriteConsoleOutputWImpl(SCREEN_INFORMATION& context, - std::span buffer, - const Microsoft::Console::Types::Viewport& requestRectangle, - Microsoft::Console::Types::Viewport& writtenRectangle) noexcept override; - - [[nodiscard]] HRESULT WriteConsoleOutputAttributeImpl(IConsoleOutputObject& OutContext, - const std::span attrs, - const til::point target, - size_t& used) noexcept override; - - [[nodiscard]] HRESULT WriteConsoleOutputCharacterAImpl(IConsoleOutputObject& OutContext, - const std::string_view text, - const til::point target, - size_t& used) noexcept override; - - [[nodiscard]] HRESULT WriteConsoleOutputCharacterWImpl(IConsoleOutputObject& OutContext, - const std::wstring_view text, - const til::point target, - size_t& used) noexcept override; - - [[nodiscard]] HRESULT ReadConsoleOutputAImpl(const SCREEN_INFORMATION& context, - std::span buffer, - const Microsoft::Console::Types::Viewport& sourceRectangle, - Microsoft::Console::Types::Viewport& readRectangle) noexcept override; - - [[nodiscard]] HRESULT ReadConsoleOutputWImpl(const SCREEN_INFORMATION& context, - std::span buffer, - const Microsoft::Console::Types::Viewport& sourceRectangle, - Microsoft::Console::Types::Viewport& readRectangle) noexcept override; - - [[nodiscard]] HRESULT GetConsoleTitleAImpl(std::span title, - size_t& written, - size_t& needed) noexcept override; - - [[nodiscard]] HRESULT GetConsoleTitleWImpl(std::span title, - size_t& written, - size_t& needed) noexcept override; - - [[nodiscard]] HRESULT GetConsoleOriginalTitleAImpl(std::span title, - size_t& written, - size_t& needed) noexcept override; - - [[nodiscard]] HRESULT GetConsoleOriginalTitleWImpl(std::span title, - size_t& written, - size_t& needed) noexcept override; - - [[nodiscard]] HRESULT SetConsoleTitleAImpl(const std::string_view title) noexcept override; - - [[nodiscard]] HRESULT SetConsoleTitleWImpl(const std::wstring_view title) noexcept override; - -#pragma endregion - -#pragma region L3 - void GetNumberOfConsoleMouseButtonsImpl(ULONG& buttons) noexcept override; - - [[nodiscard]] HRESULT GetConsoleFontSizeImpl(const SCREEN_INFORMATION& context, - const DWORD index, - til::size& size) noexcept override; - - //// driver will pare down for non-Ex method - [[nodiscard]] HRESULT GetCurrentConsoleFontExImpl(const SCREEN_INFORMATION& context, - const bool isForMaximumWindowSize, - CONSOLE_FONT_INFOEX& consoleFontInfoEx) noexcept override; - - [[nodiscard]] HRESULT SetConsoleDisplayModeImpl(SCREEN_INFORMATION& context, - const ULONG flags, - til::size& newSize) noexcept override; - - void GetConsoleDisplayModeImpl(ULONG& flags) noexcept override; - - [[nodiscard]] HRESULT AddConsoleAliasAImpl(const std::string_view source, - const std::string_view target, - const std::string_view exeName) noexcept override; - - [[nodiscard]] HRESULT AddConsoleAliasWImpl(const std::wstring_view source, - const std::wstring_view target, - const std::wstring_view exeName) noexcept override; - - [[nodiscard]] HRESULT GetConsoleAliasAImpl(const std::string_view source, - std::span target, - size_t& written, - const std::string_view exeName) noexcept override; - - [[nodiscard]] HRESULT GetConsoleAliasWImpl(const std::wstring_view source, - std::span target, - size_t& written, - const std::wstring_view exeName) noexcept override; - - [[nodiscard]] HRESULT GetConsoleAliasesLengthAImpl(const std::string_view exeName, - size_t& bufferRequired) noexcept override; - - [[nodiscard]] HRESULT GetConsoleAliasesLengthWImpl(const std::wstring_view exeName, - size_t& bufferRequired) noexcept override; - - [[nodiscard]] HRESULT GetConsoleAliasExesLengthAImpl(size_t& bufferRequired) noexcept override; - - [[nodiscard]] HRESULT GetConsoleAliasExesLengthWImpl(size_t& bufferRequired) noexcept override; - - [[nodiscard]] HRESULT GetConsoleAliasesAImpl(const std::string_view exeName, - std::span alias, - size_t& written) noexcept override; - - [[nodiscard]] HRESULT GetConsoleAliasesWImpl(const std::wstring_view exeName, - std::span alias, - size_t& written) noexcept override; - - [[nodiscard]] HRESULT GetConsoleAliasExesAImpl(std::span aliasExes, - size_t& written) noexcept override; - - [[nodiscard]] HRESULT GetConsoleAliasExesWImpl(std::span aliasExes, - size_t& written) noexcept override; - -#pragma region CMDext Private API - - [[nodiscard]] HRESULT ExpungeConsoleCommandHistoryAImpl(const std::string_view exeName) noexcept override; - - [[nodiscard]] HRESULT ExpungeConsoleCommandHistoryWImpl(const std::wstring_view exeName) noexcept override; - - [[nodiscard]] HRESULT SetConsoleNumberOfCommandsAImpl(const std::string_view exeName, - const size_t numberOfCommands) noexcept override; - - [[nodiscard]] HRESULT SetConsoleNumberOfCommandsWImpl(const std::wstring_view exeName, - const size_t numberOfCommands) noexcept override; - - [[nodiscard]] HRESULT GetConsoleCommandHistoryLengthAImpl(const std::string_view exeName, - size_t& length) noexcept override; - - [[nodiscard]] HRESULT GetConsoleCommandHistoryLengthWImpl(const std::wstring_view exeName, - size_t& length) noexcept override; - - [[nodiscard]] HRESULT GetConsoleCommandHistoryAImpl(const std::string_view exeName, - std::span commandHistory, - size_t& written) noexcept override; - - [[nodiscard]] HRESULT GetConsoleCommandHistoryWImpl(const std::wstring_view exeName, - std::span commandHistory, - size_t& written) noexcept override; - -#pragma endregion - - void GetConsoleWindowImpl(HWND& hwnd) noexcept override; - - void GetConsoleSelectionInfoImpl(CONSOLE_SELECTION_INFO& consoleSelectionInfo) noexcept override; - - void GetConsoleHistoryInfoImpl(CONSOLE_HISTORY_INFO& consoleHistoryInfo) noexcept override; - - [[nodiscard]] HRESULT SetConsoleHistoryInfoImpl(const CONSOLE_HISTORY_INFO& consoleHistoryInfo) noexcept override; - - [[nodiscard]] HRESULT SetCurrentConsoleFontExImpl(IConsoleOutputObject& context, - const bool isForMaximumWindowSize, - const CONSOLE_FONT_INFOEX& consoleFontInfoEx) noexcept override; - -#pragma endregion - - IApiRoutines* m_pUsualRoutines; - UINT& m_inputCodepage; - UINT& m_outputCodepage; - ULONG m_inputMode; - ULONG m_outputMode; - bool m_listeningForDSR; - Microsoft::Console::Render::Xterm256Engine* m_pVtEngine; - -private: - void _SynchronizeCursor(std::unique_ptr& waiter) noexcept; -}; diff --git a/src/host/VtIo.cpp b/src/host/VtIo.cpp index f9a6b722767..3d6412add00 100644 --- a/src/host/VtIo.cpp +++ b/src/host/VtIo.cpp @@ -14,8 +14,6 @@ #include "input.h" // ProcessCtrlEvents #include "output.h" // CloseConsoleProcessState -#include "VtApiRoutines.h" - using namespace Microsoft::Console; using namespace Microsoft::Console::Render; using namespace Microsoft::Console::VirtualTerminal; @@ -71,7 +69,6 @@ VtIo::VtIo() : { _lookingForCursorPosition = pArgs->GetInheritCursor(); _resizeQuirk = pArgs->IsResizeQuirkEnabled(); - _passthroughMode = pArgs->IsPassthroughMode(); // If we were already given VT handles, set up the VT IO engine to use those. if (pArgs->InConptyMode()) @@ -162,26 +159,6 @@ VtIo::VtIo() : { auto xterm256Engine = std::make_unique(std::move(_hOutput), initialViewport); - if constexpr (Feature_VtPassthroughMode::IsEnabled()) - { - if (_passthroughMode) - { - auto vtapi = new VtApiRoutines(); - vtapi->m_pVtEngine = xterm256Engine.get(); - vtapi->m_pUsualRoutines = globals.api; - - xterm256Engine->SetPassthroughMode(true); - - if (_pVtInputThread) - { - auto pfnSetListenForDSR = std::bind(&VtInputThread::SetLookingForDSR, _pVtInputThread.get(), std::placeholders::_1); - xterm256Engine->SetLookingForDSRCallback(pfnSetListenForDSR); - } - - globals.api = vtapi; - } - } - _pVtRenderEngine = std::move(xterm256Engine); break; } @@ -190,10 +167,6 @@ VtIo::VtIo() : _pVtRenderEngine = std::make_unique(std::move(_hOutput), initialViewport, false); - if (_passthroughMode) - { - return E_NOTIMPL; - } break; } case VtIoMode::XTERM_ASCII: @@ -201,11 +174,6 @@ VtIo::VtIo() : _pVtRenderEngine = std::make_unique(std::move(_hOutput), initialViewport, true); - - if (_passthroughMode) - { - return E_NOTIMPL; - } break; } default: diff --git a/src/host/VtIo.hpp b/src/host/VtIo.hpp index 2ecc0d51754..7cd12036f5d 100644 --- a/src/host/VtIo.hpp +++ b/src/host/VtIo.hpp @@ -67,7 +67,6 @@ namespace Microsoft::Console::VirtualTerminal bool _lookingForCursorPosition; bool _resizeQuirk{ false }; - bool _passthroughMode{ false }; bool _closeEventSent{ false }; std::unique_ptr _pVtRenderEngine; diff --git a/src/host/host-common.vcxitems b/src/host/host-common.vcxitems index 5ae8d7a0f3b..3456180ff1f 100644 --- a/src/host/host-common.vcxitems +++ b/src/host/host-common.vcxitems @@ -45,7 +45,6 @@ - @@ -97,7 +96,6 @@ - diff --git a/src/host/lib/hostlib.vcxproj.filters b/src/host/lib/hostlib.vcxproj.filters index 0e8177d4bc4..c70ea1a4d9f 100644 --- a/src/host/lib/hostlib.vcxproj.filters +++ b/src/host/lib/hostlib.vcxproj.filters @@ -156,9 +156,6 @@ Source Files - - Source Files - @@ -311,12 +308,9 @@ Header Files - - Header Files - - \ No newline at end of file + diff --git a/src/host/sources.inc b/src/host/sources.inc index f17c5191ac8..0c6b8fd14d2 100644 --- a/src/host/sources.inc +++ b/src/host/sources.inc @@ -86,7 +86,6 @@ SOURCES = \ ..\conareainfo.cpp \ ..\conimeinfo.cpp \ ..\ConsoleArguments.cpp \ - ..\VtApiRoutines.cpp \ # ------------------------------------- diff --git a/src/host/ut_host/ConsoleArgumentsTests.cpp b/src/host/ut_host/ConsoleArgumentsTests.cpp index 2da3663b7c2..d640469f236 100644 --- a/src/host/ut_host/ConsoleArgumentsTests.cpp +++ b/src/host/ut_host/ConsoleArgumentsTests.cpp @@ -83,8 +83,7 @@ void ConsoleArgumentsTests::ArgSplittingTests() 0, // serverHandle 0, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer true); // successful parse? commandline = L"conhost.exe \"this is the commandline\""; @@ -106,8 +105,7 @@ void ConsoleArgumentsTests::ArgSplittingTests() 0, // serverHandle 0, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer true); // successful parse? commandline = L"conhost.exe --headless \"--vtmode bar this is the commandline\""; @@ -129,8 +127,7 @@ void ConsoleArgumentsTests::ArgSplittingTests() 0, // serverHandle 0, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer true); // successful parse? commandline = L"conhost.exe --headless --server 0x4 this is the commandline"; @@ -152,8 +149,7 @@ void ConsoleArgumentsTests::ArgSplittingTests() 0x4, // serverHandle 0, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer true); // successful parse? commandline = L"conhost.exe --headless\t--vtmode\txterm\tthis\tis\tthe\tcommandline"; @@ -175,8 +171,7 @@ void ConsoleArgumentsTests::ArgSplittingTests() 0, // serverHandle 0, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer true); // successful parse? commandline = L"conhost.exe --headless\\ foo\\ --outpipe\\ bar\\ this\\ is\\ the\\ commandline"; @@ -198,8 +193,7 @@ void ConsoleArgumentsTests::ArgSplittingTests() 0, // serverHandle 0, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer true); // successful parse? commandline = L"conhost.exe --headless\\\tfoo\\\t--outpipe\\\tbar\\\tthis\\\tis\\\tthe\\\tcommandline"; @@ -221,8 +215,7 @@ void ConsoleArgumentsTests::ArgSplittingTests() 0, // serverHandle 0, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer true); // successful parse? commandline = L"conhost.exe --vtmode a\\\\\\\\\"b c\" d e"; @@ -244,8 +237,7 @@ void ConsoleArgumentsTests::ArgSplittingTests() 0, // serverHandle 0, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer true); // successful parse? commandline = L"conhost.exe this is the commandline"; @@ -267,8 +259,7 @@ void ConsoleArgumentsTests::ArgSplittingTests() 0, // serverHandle 0, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer true); // successful parse? } @@ -295,8 +286,7 @@ void ConsoleArgumentsTests::ClientCommandlineTests() 0, // serverHandle 0, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer true); // successful parse? commandline = L"conhost.exe foo"; @@ -318,8 +308,7 @@ void ConsoleArgumentsTests::ClientCommandlineTests() 0, // serverHandle 0, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer true); // successful parse? commandline = L"conhost.exe foo -- bar"; @@ -341,8 +330,7 @@ void ConsoleArgumentsTests::ClientCommandlineTests() 0, // serverHandle 0, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer true); // successful parse? commandline = L"conhost.exe --vtmode foo foo -- bar"; @@ -364,8 +352,7 @@ void ConsoleArgumentsTests::ClientCommandlineTests() 0, // serverHandle 0, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer true); // successful parse? commandline = L"conhost.exe console --vtmode foo foo -- bar"; @@ -387,8 +374,7 @@ void ConsoleArgumentsTests::ClientCommandlineTests() 0, // serverHandle 0, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer true); // successful parse? commandline = L"conhost.exe console --vtmode foo --outpipe foo -- bar"; @@ -410,8 +396,7 @@ void ConsoleArgumentsTests::ClientCommandlineTests() 0, // serverHandle 0, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer true); // successful parse? commandline = L"conhost.exe --vtmode foo -- --outpipe foo bar"; @@ -433,8 +418,7 @@ void ConsoleArgumentsTests::ClientCommandlineTests() 0, // serverHandle 0, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer true); // successful parse? commandline = L"conhost.exe --vtmode -- --headless bar"; @@ -456,8 +440,7 @@ void ConsoleArgumentsTests::ClientCommandlineTests() 0, // serverHandle 0, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer true); // successful parse? commandline = L"conhost.exe --"; @@ -479,8 +462,7 @@ void ConsoleArgumentsTests::ClientCommandlineTests() 0, // serverHandle 0, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer true); // successful parse? commandline = L"conhost.exe"; @@ -502,8 +484,7 @@ void ConsoleArgumentsTests::ClientCommandlineTests() 0, // serverHandle 0, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer true); // successful parse? } @@ -530,8 +511,7 @@ void ConsoleArgumentsTests::LegacyFormatsTests() 4ul, // serverHandle 0, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer true); // successful parse? commandline = L"conhost.exe --server 0x4"; @@ -553,8 +533,7 @@ void ConsoleArgumentsTests::LegacyFormatsTests() 4ul, // serverHandle 0, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer true); // successful parse? commandline = L"conhost.exe 0x4 0x8"; @@ -576,8 +555,7 @@ void ConsoleArgumentsTests::LegacyFormatsTests() 4ul, // serverHandle 0, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer false); // successful parse? commandline = L"conhost.exe --server 0x4 0x8"; @@ -599,8 +577,7 @@ void ConsoleArgumentsTests::LegacyFormatsTests() 4ul, // serverHandle 0, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer false); // successful parse? commandline = L"conhost.exe 0x4 --server 0x8"; @@ -622,8 +599,7 @@ void ConsoleArgumentsTests::LegacyFormatsTests() 4ul, // serverHandle 0, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer false); // successful parse? commandline = L"conhost.exe --server 0x4 --server 0x8"; @@ -645,8 +621,7 @@ void ConsoleArgumentsTests::LegacyFormatsTests() 4ul, // serverHandle 0, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer false); // successful parse? commandline = L"conhost.exe 0x4 -ForceV1"; @@ -668,8 +643,7 @@ void ConsoleArgumentsTests::LegacyFormatsTests() 4ul, // serverHandle 0, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer true); // successful parse? commandline = L"conhost.exe -ForceV1"; @@ -691,8 +665,7 @@ void ConsoleArgumentsTests::LegacyFormatsTests() 0, // serverHandle 0, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer true); // successful parse? commandline = L"conhost.exe 0x4 -ForceNoHandoff"; @@ -714,8 +687,7 @@ void ConsoleArgumentsTests::LegacyFormatsTests() 4ul, // serverHandle 0, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer true); // successful parse? commandline = L"conhost.exe -ForceNoHandoff"; @@ -737,8 +709,7 @@ void ConsoleArgumentsTests::LegacyFormatsTests() 0, // serverHandle 0, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer true); // successful parse? } @@ -789,8 +760,7 @@ void ConsoleArgumentsTests::CombineVtPipeHandleTests() 0ul, // serverHandle 0, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer true); // successful parse? commandline = L"conhost.exe --vtmode xterm-256color"; @@ -812,8 +782,7 @@ void ConsoleArgumentsTests::CombineVtPipeHandleTests() 0ul, // serverHandle 0, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer true); // successful parse? } @@ -850,8 +819,7 @@ void ConsoleArgumentsTests::InitialSizeTests() 0ul, // serverHandle 0, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer true); // successful parse? commandline = L"conhost.exe --width 120"; @@ -873,8 +841,7 @@ void ConsoleArgumentsTests::InitialSizeTests() 0ul, // serverHandle 0, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer true); // successful parse? commandline = L"conhost.exe --height 30"; @@ -896,8 +863,7 @@ void ConsoleArgumentsTests::InitialSizeTests() 0ul, // serverHandle 0, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer true); // successful parse? commandline = L"conhost.exe --width 0"; @@ -919,8 +885,7 @@ void ConsoleArgumentsTests::InitialSizeTests() 0ul, // serverHandle 0, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer true); // successful parse? commandline = L"conhost.exe --width -1"; @@ -942,8 +907,7 @@ void ConsoleArgumentsTests::InitialSizeTests() 0ul, // serverHandle 0, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer true); // successful parse? commandline = L"conhost.exe --width foo"; @@ -965,8 +929,7 @@ void ConsoleArgumentsTests::InitialSizeTests() 0ul, // serverHandle 0, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer false); // successful parse? commandline = L"conhost.exe --width 2foo"; @@ -988,8 +951,7 @@ void ConsoleArgumentsTests::InitialSizeTests() 0ul, // serverHandle 0, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer false); // successful parse? commandline = L"conhost.exe --width 65535"; @@ -1011,8 +973,7 @@ void ConsoleArgumentsTests::InitialSizeTests() 0ul, // serverHandle 0, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer false); // successful parse? } @@ -1039,8 +1000,7 @@ void ConsoleArgumentsTests::HeadlessArgTests() 0, // serverHandle 0, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer true); // successful parse? commandline = L"conhost.exe --headless 0x4"; @@ -1062,8 +1022,7 @@ void ConsoleArgumentsTests::HeadlessArgTests() 4ul, // serverHandle 0, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer true); // successful parse? commandline = L"conhost.exe --headless --headless"; @@ -1085,8 +1044,7 @@ void ConsoleArgumentsTests::HeadlessArgTests() 0, // serverHandle 0, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer true); // successful parse? commandline = L"conhost.exe -- foo.exe --headless"; @@ -1108,8 +1066,7 @@ void ConsoleArgumentsTests::HeadlessArgTests() 0, // serverHandle 0, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer true); // successful parse? } @@ -1140,8 +1097,7 @@ void ConsoleArgumentsTests::SignalHandleTests() 4ul, // serverHandle 8ul, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer true); // successful parse? commandline = L"conhost.exe --server 0x4 --signal ASDF"; @@ -1163,8 +1119,7 @@ void ConsoleArgumentsTests::SignalHandleTests() 4ul, // serverHandle 0ul, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer false); // successful parse? commandline = L"conhost.exe --signal --server 0x4"; @@ -1186,8 +1141,7 @@ void ConsoleArgumentsTests::SignalHandleTests() 0ul, // serverHandle 0ul, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer false); // successful parse? } @@ -1218,8 +1172,7 @@ void ConsoleArgumentsTests::FeatureArgTests() 0, // serverHandle 0, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer true); // successful parse? commandline = L"conhost.exe --feature tty"; ArgTestsRunner(L"#2 Error case, pass an unsupported feature", @@ -1240,8 +1193,7 @@ void ConsoleArgumentsTests::FeatureArgTests() 0, // serverHandle 0, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer false); // successful parse? commandline = L"conhost.exe --feature pty --feature pty"; @@ -1263,8 +1215,7 @@ void ConsoleArgumentsTests::FeatureArgTests() 0, // serverHandle 0, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer true); // successful parse? commandline = L"conhost.exe --feature pty --feature tty"; @@ -1286,8 +1237,7 @@ void ConsoleArgumentsTests::FeatureArgTests() 0, // serverHandle 0, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer false); // successful parse? commandline = L"conhost.exe --feature pty --feature"; @@ -1309,8 +1259,7 @@ void ConsoleArgumentsTests::FeatureArgTests() 0, // serverHandle 0, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer false); // successful parse? commandline = L"conhost.exe --feature pty --feature --signal foo"; @@ -1332,7 +1281,6 @@ void ConsoleArgumentsTests::FeatureArgTests() 0, // serverHandle 0, // signalHandle false, // inheritCursor - false, // runAsComServer - false), // passthroughMode + false), // runAsComServer false); // successful parse? } diff --git a/src/inc/conpty-static.h b/src/inc/conpty-static.h index 4d22048868c..1dd9a4123e2 100644 --- a/src/inc/conpty-static.h +++ b/src/inc/conpty-static.h @@ -24,7 +24,6 @@ #endif #define PSEUDOCONSOLE_RESIZE_QUIRK (2u) -#define PSEUDOCONSOLE_PASSTHROUGH_MODE (8u) CONPTY_EXPORT HRESULT WINAPI ConptyCreatePseudoConsole(COORD size, HANDLE hInput, HANDLE hOutput, DWORD dwFlags, HPCON* phPC); CONPTY_EXPORT HRESULT WINAPI ConptyCreatePseudoConsoleAsUser(HANDLE hToken, COORD size, HANDLE hInput, HANDLE hOutput, DWORD dwFlags, HPCON* phPC); diff --git a/src/renderer/vt/Xterm256Engine.hpp b/src/renderer/vt/Xterm256Engine.hpp index 9d704c34dd8..5c8cde61831 100644 --- a/src/renderer/vt/Xterm256Engine.hpp +++ b/src/renderer/vt/Xterm256Engine.hpp @@ -18,8 +18,6 @@ Author(s): #include "XtermEngine.hpp" -class VtApiRoutines; - namespace Microsoft::Console::Render { class Xterm256Engine : public XtermEngine @@ -38,8 +36,6 @@ namespace Microsoft::Console::Render [[nodiscard]] HRESULT ManuallyClearScrollback() noexcept override; - friend class ::VtApiRoutines; - private: [[nodiscard]] HRESULT _UpdateExtendedAttrs(const TextAttribute& textAttributes) noexcept; [[nodiscard]] HRESULT _UpdateHyperlinkAttr(const TextAttribute& textAttributes, diff --git a/src/renderer/vt/state.cpp b/src/renderer/vt/state.cpp index 5bb6b7d694d..9749bf63d32 100644 --- a/src/renderer/vt/state.cpp +++ b/src/renderer/vt/state.cpp @@ -475,19 +475,6 @@ void VtEngine::SetResizeQuirk(const bool resizeQuirk) _resizeQuirk = resizeQuirk; } -// Method Description: -// - Configure the renderer to understand that we're operating in limited-draw -// passthrough mode. We do not need to handle full responsibility for replicating -// buffer state to the attached terminal. -// Arguments: -// - passthrough - True to turn on passthrough mode. False otherwise. -// Return Value: -// - true iff we were started with an output mode for passthrough. false otherwise. -void VtEngine::SetPassthroughMode(const bool passthrough) noexcept -{ - _passthrough = passthrough; -} - void VtEngine::SetLookingForDSRCallback(std::function pfnLooking) noexcept { _pfnSetLookingForDSR = pfnLooking; diff --git a/src/renderer/vt/vtrenderer.hpp b/src/renderer/vt/vtrenderer.hpp index 7a974850afc..1a7c25316fd 100644 --- a/src/renderer/vt/vtrenderer.hpp +++ b/src/renderer/vt/vtrenderer.hpp @@ -82,7 +82,6 @@ namespace Microsoft::Console::Render [[nodiscard]] virtual HRESULT WriteTerminalW(const std::wstring_view str) noexcept = 0; void SetTerminalOwner(Microsoft::Console::VirtualTerminal::VtIo* const terminalOwner); void SetResizeQuirk(const bool resizeQuirk); - void SetPassthroughMode(const bool passthrough) noexcept; void SetLookingForDSRCallback(std::function pfnLooking) noexcept; void SetTerminalCursorTextPosition(const til::point coordCursor) noexcept; [[nodiscard]] virtual HRESULT ManuallyClearScrollback() noexcept; diff --git a/src/server/ApiSorter.cpp b/src/server/ApiSorter.cpp index 39cf676e497..7e20b290f59 100644 --- a/src/server/ApiSorter.cpp +++ b/src/server/ApiSorter.cpp @@ -168,14 +168,25 @@ PCONSOLE_API_MSG ApiSorter::ConsoleDispatchRequest(_Inout_ PCONSOLE_API_MSG Mess Message->State.WriteOffset = Message->msgHeader.ApiDescriptorSize; Message->State.ReadOffset = Message->msgHeader.ApiDescriptorSize + sizeof(CONSOLE_MSG_HEADER); + HRESULT hr = S_OK; + try + { + hr = (*Descriptor->Routine)(Message, &ReplyPending); + } + catch (const wil::ResultException& e) + { + hr = e.GetStatusCode(); + } + catch (...) + { + hr = E_UNEXPECTED; + } + // Unfortunately, we can't be as clear-cut with our error codes as we'd like since we have some callers that take // hard dependencies on NTSTATUS codes that aren't readily expressible as an HRESULT. There's currently only one // such known code -- STATUS_BUFFER_TOO_SMALL. There's a conlibk dependency on this being returned from the console // alias API. - NTSTATUS Status = S_OK; - { - Status = (*Descriptor->Routine)(Message, &ReplyPending); - } + NTSTATUS Status = hr; if (Status != STATUS_BUFFER_TOO_SMALL) { Status = NTSTATUS_FROM_HRESULT(Status); diff --git a/src/server/IApiRoutines.h b/src/server/IApiRoutines.h index 87830795c6c..9c99136c2c3 100644 --- a/src/server/IApiRoutines.h +++ b/src/server/IApiRoutines.h @@ -28,22 +28,13 @@ typedef InputBuffer IConsoleInputObject; class INPUT_READ_HANDLE_DATA; #include "IWaitRoutine.h" -#include -#include #include "../types/inc/IInputEvent.hpp" #include "../types/inc/viewport.hpp" -class IApiRoutines +class __declspec(novtable) IApiRoutines { public: -#pragma region ObjectManagement - // TODO: 9115192 - We will need to make the objects via an interface eventually. This represents that idea. - /*virtual HRESULT CreateInitialObjects(_Out_ IConsoleInputObject** const ppInputObject, - _Out_ IConsoleOutputObject** const ppOutputObject); -*/ - -#pragma endregion - +#pragma warning(suppress : 26432) // If you define or delete any default operation in the type '...', define or delete them all (c.21). virtual ~IApiRoutines() = default; #pragma region L1 diff --git a/src/winconpty/winconpty.cpp b/src/winconpty/winconpty.cpp index 323e4f788f9..16bb278b7da 100644 --- a/src/winconpty/winconpty.cpp +++ b/src/winconpty/winconpty.cpp @@ -133,23 +133,20 @@ HRESULT _CreatePseudoConsole(const HANDLE hToken, RETURN_IF_WIN32_BOOL_FALSE(SetHandleInformation(signalPipeConhostSide.get(), HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT)); // GH4061: Ensure that the path to executable in the format is escaped so C:\Program.exe cannot collide with C:\Program Files - auto pwszFormat = L"\"%s\" --headless %s%s%s--width %hu --height %hu --signal 0x%x --server 0x%x"; // This is plenty of space to hold the formatted string wchar_t cmd[MAX_PATH]{}; const BOOL bInheritCursor = (dwFlags & PSEUDOCONSOLE_INHERIT_CURSOR) == PSEUDOCONSOLE_INHERIT_CURSOR; const BOOL bResizeQuirk = (dwFlags & PSEUDOCONSOLE_RESIZE_QUIRK) == PSEUDOCONSOLE_RESIZE_QUIRK; - const BOOL bPassthroughMode = (dwFlags & PSEUDOCONSOLE_PASSTHROUGH_MODE) == PSEUDOCONSOLE_PASSTHROUGH_MODE; swprintf_s(cmd, MAX_PATH, - pwszFormat, + L"\"%s\" --headless %s%s--width %hd --height %hd --signal 0x%tx --server 0x%tx", _ConsoleHostPath(), bInheritCursor ? L"--inheritcursor " : L"", bResizeQuirk ? L"--resizeQuirk " : L"", - bPassthroughMode ? L"--passthrough " : L"", size.X, size.Y, - signalPipeConhostSide.get(), - serverHandle.get()); + std::bit_cast(signalPipeConhostSide.get()), + std::bit_cast(serverHandle.get())); STARTUPINFOEXW siEx{ 0 }; siEx.StartupInfo.cb = sizeof(STARTUPINFOEXW); diff --git a/src/winconpty/winconpty.h b/src/winconpty/winconpty.h index 744ec09916d..a38fdef8594 100644 --- a/src/winconpty/winconpty.h +++ b/src/winconpty/winconpty.h @@ -58,9 +58,6 @@ typedef struct _PseudoConsole #ifndef PSEUDOCONSOLE_WIN32_INPUT_MODE #define PSEUDOCONSOLE_WIN32_INPUT_MODE (0x4) #endif -#ifndef PSEUDOCONSOLE_PASSTHROUGH_MODE -#define PSEUDOCONSOLE_PASSTHROUGH_MODE (0x8) -#endif // Implementations of the various PseudoConsole functions. HRESULT _CreatePseudoConsole(const HANDLE hToken,