Skip to content

Commit

Permalink
Pass through DCS responses when VT input disabled
Browse files Browse the repository at this point in the history
  • Loading branch information
j4james committed Aug 31, 2024
1 parent 17a55da commit 2cd58df
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 1 deletion.
15 changes: 14 additions & 1 deletion src/terminal/parser/InputStateMachineEngine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -327,6 +327,16 @@ bool InputStateMachineEngine::ActionPassThroughString(const std::wstring_view st
// - true iff we successfully dispatched the sequence.
bool InputStateMachineEngine::ActionEscDispatch(const VTID id)
{
// If the _expectingStringTerminator flag is set, that means we've been
// processing a DCS sequence and are waiting for the string terminator.
// Once we receive the ST sequence here, we can return false to force the
// buffered DCS content to be flushed.
if (_expectingStringTerminator && id == VTID("\\"))
{
_expectingStringTerminator = false;
return false;
}

if (_pDispatch->IsVtInputEnabled())
{
return false;
Expand Down Expand Up @@ -524,7 +534,10 @@ bool InputStateMachineEngine::ActionCsiDispatch(const VTID id, const VTParameter
// - the data string handler function or nullptr if the sequence is not supported
IStateMachineEngine::StringHandler InputStateMachineEngine::ActionDcsDispatch(const VTID /*id*/, const VTParameters /*parameters*/) noexcept
{
// DCS escape sequences are not used in the input state machine.
// Returning a nullptr here will cause the content of the DCS sequence to be
// ignored, but it'll still be buffered by the state machine, so we can flush
// the whole thing once we receive the string terminator.
_expectingStringTerminator = true;
return nullptr;
}

Expand Down
1 change: 1 addition & 0 deletions src/terminal/parser/InputStateMachineEngine.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,7 @@ namespace Microsoft::Console::VirtualTerminal
std::atomic<uint64_t> _deviceAttributes{ 0 };
bool _lookingForDSR = false;
bool _encounteredWin32InputModeSequence = false;
bool _expectingStringTerminator = false;
DWORD _mouseButtonState = 0;
std::chrono::milliseconds _doubleClickTime;
std::optional<til::point> _lastMouseClickPos{};
Expand Down

0 comments on commit 2cd58df

Please sign in to comment.