diff --git a/src/terminal/adapter/IInteractDispatch.hpp b/src/terminal/adapter/IInteractDispatch.hpp index 4006c4c82a..b8aba0fb1a 100644 --- a/src/terminal/adapter/IInteractDispatch.hpp +++ b/src/terminal/adapter/IInteractDispatch.hpp @@ -33,6 +33,7 @@ namespace Microsoft::Console::VirtualTerminal virtual void WriteInput(const std::span& inputEvents) = 0; virtual void WriteCtrlKey(const INPUT_RECORD& event) = 0; virtual void WriteString(std::wstring_view string) = 0; + virtual void WriteStringRaw(std::wstring_view string) = 0; virtual void WindowManipulation(DispatchTypes::WindowManipulationType function, VTParameter parameter1, VTParameter parameter2) = 0; virtual void MoveCursor(VTInt row, VTInt col) = 0; virtual void FocusChanged(bool focused) = 0; diff --git a/src/terminal/adapter/InteractDispatch.cpp b/src/terminal/adapter/InteractDispatch.cpp index 1f859c6916..fa1a082604 100644 --- a/src/terminal/adapter/InteractDispatch.cpp +++ b/src/terminal/adapter/InteractDispatch.cpp @@ -53,10 +53,11 @@ void InteractDispatch::WriteCtrlKey(const INPUT_RECORD& event) HandleGenericKeyEvent(event, false); } -// Method Description: -// - Writes a string of input to the host. -// Arguments: -// - string : a string to write to the console. +// Call this method to write some plain text to the InputBuffer. +// +// Since the hosting terminal for ConPTY may not support win32-input-mode, +// it may send an "A" key as an "A", for which we need to generate up/down events. +// Because of this, we cannot simply call InputBuffer::WriteString directly. void InteractDispatch::WriteString(const std::wstring_view string) { if (!string.empty()) @@ -73,6 +74,12 @@ void InteractDispatch::WriteString(const std::wstring_view string) } } +void InteractDispatch::WriteStringRaw(std::wstring_view string) +{ + const auto& gci = ServiceLocator::LocateGlobals().getConsoleInformation(); + gci.GetActiveInputBuffer()->WriteString(string); +} + //Method Description: // Window Manipulation - Performs a variety of actions relating to the window, // such as moving the window position, resizing the window, querying diff --git a/src/terminal/adapter/InteractDispatch.hpp b/src/terminal/adapter/InteractDispatch.hpp index 189d73e2a5..2fe63b08fd 100644 --- a/src/terminal/adapter/InteractDispatch.hpp +++ b/src/terminal/adapter/InteractDispatch.hpp @@ -30,6 +30,7 @@ namespace Microsoft::Console::VirtualTerminal void WriteInput(const std::span& inputEvents) override; void WriteCtrlKey(const INPUT_RECORD& event) override; void WriteString(std::wstring_view string) override; + void WriteStringRaw(std::wstring_view string) override; void WindowManipulation(DispatchTypes::WindowManipulationType function, VTParameter parameter1, VTParameter parameter2) override; void MoveCursor(VTInt row, VTInt col) override; void FocusChanged(bool focused) override; diff --git a/src/terminal/parser/InputStateMachineEngine.cpp b/src/terminal/parser/InputStateMachineEngine.cpp index da558b9dbe..af781a9c8d 100644 --- a/src/terminal/parser/InputStateMachineEngine.cpp +++ b/src/terminal/parser/InputStateMachineEngine.cpp @@ -293,27 +293,10 @@ bool InputStateMachineEngine::ActionPrintString(const std::wstring_view string) // - true iff we successfully dispatched the sequence. bool InputStateMachineEngine::ActionPassThroughString(const std::wstring_view string) { - if (string.empty()) + if (!string.empty()) { - return true; + _pDispatch->WriteStringRaw(string); } - - if (_pDispatch->IsVtInputEnabled()) - { - // Synthesize string into key events that we'll write to the buffer - // similar to TerminalInput::_SendInputSequence - InputEventQueue inputEvents; - for (const auto& wch : string) - { - inputEvents.push_back(SynthesizeKeyEvent(true, 1, 0, 0, wch, 0)); - } - _pDispatch->WriteInput(inputEvents); - } - else - { - _pDispatch->WriteString(string); - } - return true; } diff --git a/src/terminal/parser/ut_parser/InputEngineTest.cpp b/src/terminal/parser/ut_parser/InputEngineTest.cpp index 00684b36ff..cdfaf1ac1e 100644 --- a/src/terminal/parser/ut_parser/InputEngineTest.cpp +++ b/src/terminal/parser/ut_parser/InputEngineTest.cpp @@ -322,6 +322,7 @@ public: const VTParameter parameter1, const VTParameter parameter2) override; // DTTERM_WindowManipulation virtual void WriteString(const std::wstring_view string) override; + virtual void WriteStringRaw(const std::wstring_view string) override; virtual void MoveCursor(const VTInt row, const VTInt col) override; @@ -377,6 +378,18 @@ void TestInteractDispatch::WriteString(const std::wstring_view string) WriteInput(keyEvents); } +void TestInteractDispatch::WriteStringRaw(const std::wstring_view string) +{ + InputEventQueue keyEvents; + + for (const auto& wch : string) + { + keyEvents.push_back(SynthesizeKeyEvent(true, 1, 0, 0, wch, 0)); + } + + WriteInput(keyEvents); +} + void TestInteractDispatch::MoveCursor(const VTInt row, const VTInt col) { VERIFY_IS_TRUE(_testState->_expectCursorPosition); diff --git a/src/tools/vtpipeterm/main.cpp b/src/tools/vtpipeterm/main.cpp index 51be0dc5fd..fa79b0b9cf 100644 --- a/src/tools/vtpipeterm/main.cpp +++ b/src/tools/vtpipeterm/main.cpp @@ -184,7 +184,7 @@ static int run(int argc, const wchar_t* argv[]) if (write != 0) { DWORD written; - if (!WriteFile(pipe.server.get(), &inputConptyBuffer[0], write, &written, nullptr) || written != read) + if (!WriteFile(pipe.server.get(), &inputConptyBuffer[0], write, &written, nullptr) || written != write) { return 0; }