From 6a7f9a2bfe7612cfa38bde744b7c956b7cc7665a Mon Sep 17 00:00:00 2001 From: James Holderness Date: Thu, 1 Aug 2024 19:53:08 +0100 Subject: [PATCH] Hook up the dispatch framework for the DECRQTSR query. --- src/terminal/adapter/ITermDispatch.hpp | 1 + src/terminal/adapter/adaptDispatch.cpp | 31 +++++++++++++++++++ src/terminal/adapter/adaptDispatch.hpp | 2 ++ src/terminal/adapter/termDispatch.hpp | 1 + .../parser/OutputStateMachineEngine.cpp | 3 ++ .../parser/OutputStateMachineEngine.hpp | 1 + 6 files changed, 39 insertions(+) diff --git a/src/terminal/adapter/ITermDispatch.hpp b/src/terminal/adapter/ITermDispatch.hpp index 01313efb8b4..bf4d2cc5bd5 100644 --- a/src/terminal/adapter/ITermDispatch.hpp +++ b/src/terminal/adapter/ITermDispatch.hpp @@ -171,6 +171,7 @@ class Microsoft::Console::VirtualTerminal::ITermDispatch const DispatchTypes::MacroEncoding encoding) = 0; // DECDMAC virtual bool InvokeMacro(const VTInt macroId) = 0; // DECINVM + virtual bool RequestTerminalStateReport(const DispatchTypes::ReportFormat format, const VTParameter formatOption) = 0; // DECRQTSR virtual StringHandler RestoreTerminalState(const DispatchTypes::ReportFormat format) = 0; // DECRSTS virtual StringHandler RequestSetting() = 0; // DECRQSS diff --git a/src/terminal/adapter/adaptDispatch.cpp b/src/terminal/adapter/adaptDispatch.cpp index d4a42e4ade4..91fe79668a2 100644 --- a/src/terminal/adapter/adaptDispatch.cpp +++ b/src/terminal/adapter/adaptDispatch.cpp @@ -4166,6 +4166,27 @@ bool AdaptDispatch::InvokeMacro(const VTInt macroId) return true; } +// Routine Description: +// - DECRQTSR - Queries the state of the terminal. This can either be a terminal +// state report, generally covering all settable state in the terminal (with +// the exception of large data items), or a color table report. +// Arguments: +// - format - the format of the report being requested. +// - formatOption - a format-specific option. +// Return Value: +// - True if handled successfully. False otherwise. +bool AdaptDispatch::RequestTerminalStateReport(const DispatchTypes::ReportFormat format, const VTParameter formatOption) +{ + switch (format) + { + case DispatchTypes::ReportFormat::ColorTableReport: + _ReportColorTable(formatOption); + return true; + default: + return false; + } +} + // Method Description: // - DECRSTS - Restores the terminal state from a stream of data previously // saved with a DECRQTSR query. @@ -4184,6 +4205,16 @@ ITermDispatch::StringHandler AdaptDispatch::RestoreTerminalState(const DispatchT } } +// Method Description: +// - DECCTR - Returns the Color Table Report in response to a DECRQTSR query. +// Arguments: +// - colorModel - the color model to use in the report (1 = HLS, 2 = RGB). +// Return Value: +// - None +void AdaptDispatch::_ReportColorTable(const DispatchTypes::ColorModel /*colorModel*/) const +{ +} + // Method Description: // - DECCTR - This is a parser for the Color Table Report received via DECRSTS. // The report contains a list of color definitions separated with a slash diff --git a/src/terminal/adapter/adaptDispatch.hpp b/src/terminal/adapter/adaptDispatch.hpp index 8d8cc07e0c0..cba0273665d 100644 --- a/src/terminal/adapter/adaptDispatch.hpp +++ b/src/terminal/adapter/adaptDispatch.hpp @@ -174,6 +174,7 @@ namespace Microsoft::Console::VirtualTerminal const DispatchTypes::MacroEncoding encoding) override; // DECDMAC bool InvokeMacro(const VTInt macroId) override; // DECINVM + bool RequestTerminalStateReport(const DispatchTypes::ReportFormat format, const VTParameter formatOption) override; // DECRQTSR StringHandler RestoreTerminalState(const DispatchTypes::ReportFormat format) override; // DECRSTS StringHandler RequestSetting() override; // DECRQSS @@ -272,6 +273,7 @@ namespace Microsoft::Console::VirtualTerminal void _ClearAllTabStops() noexcept; void _InitTabStopsForWidth(const VTInt width); + void _ReportColorTable(const DispatchTypes::ColorModel colorModel) const; StringHandler _RestoreColorTable(); void _ReportSGRSetting() const; diff --git a/src/terminal/adapter/termDispatch.hpp b/src/terminal/adapter/termDispatch.hpp index cce60582fd5..607089545bf 100644 --- a/src/terminal/adapter/termDispatch.hpp +++ b/src/terminal/adapter/termDispatch.hpp @@ -164,6 +164,7 @@ class Microsoft::Console::VirtualTerminal::TermDispatch : public Microsoft::Cons const DispatchTypes::MacroEncoding /*encoding*/) override { return nullptr; } // DECDMAC bool InvokeMacro(const VTInt /*macroId*/) override { return false; } // DECINVM + bool RequestTerminalStateReport(const DispatchTypes::ReportFormat /*format*/, const VTParameter /*formatOption*/) override { return false; } // DECRQTSR StringHandler RestoreTerminalState(const DispatchTypes::ReportFormat /*format*/) override { return nullptr; }; // DECRSTS StringHandler RequestSetting() override { return nullptr; }; // DECRQSS diff --git a/src/terminal/parser/OutputStateMachineEngine.cpp b/src/terminal/parser/OutputStateMachineEngine.cpp index 38036ce6da8..66c993ac06b 100644 --- a/src/terminal/parser/OutputStateMachineEngine.cpp +++ b/src/terminal/parser/OutputStateMachineEngine.cpp @@ -626,6 +626,9 @@ bool OutputStateMachineEngine::ActionCsiDispatch(const VTID id, const VTParamete case CsiActionCodes::DECCRA_CopyRectangularArea: success = _dispatch->CopyRectangularArea(parameters.at(0), parameters.at(1), parameters.at(2).value_or(0), parameters.at(3).value_or(0), parameters.at(4), parameters.at(5), parameters.at(6), parameters.at(7)); break; + case CsiActionCodes::DECRQTSR_RequestTerminalStateReport: + success = _dispatch->RequestTerminalStateReport(parameters.at(0), parameters.at(1)); + break; case CsiActionCodes::DECRQPSR_RequestPresentationStateReport: success = _dispatch->RequestPresentationStateReport(parameters.at(0)); break; diff --git a/src/terminal/parser/OutputStateMachineEngine.hpp b/src/terminal/parser/OutputStateMachineEngine.hpp index 5be20ae2513..c661bcecc6c 100644 --- a/src/terminal/parser/OutputStateMachineEngine.hpp +++ b/src/terminal/parser/OutputStateMachineEngine.hpp @@ -154,6 +154,7 @@ namespace Microsoft::Console::VirtualTerminal DECRQM_PrivateRequestMode = VTID("?$p"), DECCARA_ChangeAttributesRectangularArea = VTID("$r"), DECRARA_ReverseAttributesRectangularArea = VTID("$t"), + DECRQTSR_RequestTerminalStateReport = VTID("$u"), DECCRA_CopyRectangularArea = VTID("$v"), DECRQPSR_RequestPresentationStateReport = VTID("$w"), DECFRA_FillRectangularArea = VTID("$x"),