6140fd9ab8
This PR adds support for the `DECRQSS` (Request Selection or Setting) escape sequence, which is a standard VT query for reporting the state of various control functions. This initial implementation only supports queries for the `DECSTBM` margins, and the `SGR` graphic rendition attributes. This can be useful for certain forms of capability detection (#1040). As one example in particular, it can serve as an alternative to the `COLORTERM` environment variable for detecting truecolor support (#11057). Of the settings that can be queried by `DECRQSS`, the only other one that we could be supporting at the moment is `DECSCUSR` (Cursor Style). However, that would require passing the query through to the conpty client, which is a lot more complicated, so I thought it best to leave for a future PR. For now this gets the basic framework in place, so we are at least responding to queries, and even just supporting the `SGR` attributes query is useful in itself. Validation ---------- I've added a unit test verifying the reports for the `DECSTBM` and `SGR` settings with a range of different parameters. I've also tested the `DECSTBM` and `SGR` reports manually in _Vttest_, under menu 11.2.5.3.6 (Status-String Reports).
149 lines
8.1 KiB
C++
149 lines
8.1 KiB
C++
// Copyright (c) Microsoft Corporation.
|
|
// Licensed under the MIT license.
|
|
|
|
/*
|
|
Module Name:
|
|
- ITermDispatch.hpp
|
|
|
|
Abstract:
|
|
- This is the interface for all output state machine callbacks. When actions
|
|
occur, they will be dispatched to the methods on this interface which must
|
|
be implemented by a child class and passed into the state machine on
|
|
creation.
|
|
*/
|
|
#pragma once
|
|
#include "DispatchTypes.hpp"
|
|
#include "../buffer/out/LineRendition.hpp"
|
|
|
|
namespace Microsoft::Console::VirtualTerminal
|
|
{
|
|
class ITermDispatch;
|
|
};
|
|
|
|
class Microsoft::Console::VirtualTerminal::ITermDispatch
|
|
{
|
|
public:
|
|
using StringHandler = std::function<bool(const wchar_t)>;
|
|
|
|
#pragma warning(push)
|
|
#pragma warning(disable : 26432) // suppress rule of 5 violation on interface because tampering with this is fraught with peril
|
|
virtual ~ITermDispatch() = 0;
|
|
|
|
virtual void Execute(const wchar_t wchControl) = 0;
|
|
virtual void Print(const wchar_t wchPrintable) = 0;
|
|
virtual void PrintString(const std::wstring_view string) = 0;
|
|
|
|
virtual bool CursorUp(const size_t distance) = 0; // CUU
|
|
virtual bool CursorDown(const size_t distance) = 0; // CUD
|
|
virtual bool CursorForward(const size_t distance) = 0; // CUF
|
|
virtual bool CursorBackward(const size_t distance) = 0; // CUB, BS
|
|
virtual bool CursorNextLine(const size_t distance) = 0; // CNL
|
|
virtual bool CursorPrevLine(const size_t distance) = 0; // CPL
|
|
virtual bool CursorHorizontalPositionAbsolute(const size_t column) = 0; // HPA, CHA
|
|
virtual bool VerticalLinePositionAbsolute(const size_t line) = 0; // VPA
|
|
virtual bool HorizontalPositionRelative(const size_t distance) = 0; // HPR
|
|
virtual bool VerticalPositionRelative(const size_t distance) = 0; // VPR
|
|
virtual bool CursorPosition(const size_t line, const size_t column) = 0; // CUP, HVP
|
|
virtual bool CursorSaveState() = 0; // DECSC
|
|
virtual bool CursorRestoreState() = 0; // DECRC
|
|
virtual bool CursorVisibility(const bool isVisible) = 0; // DECTCEM
|
|
virtual bool InsertCharacter(const size_t count) = 0; // ICH
|
|
virtual bool DeleteCharacter(const size_t count) = 0; // DCH
|
|
virtual bool ScrollUp(const size_t distance) = 0; // SU
|
|
virtual bool ScrollDown(const size_t distance) = 0; // SD
|
|
virtual bool InsertLine(const size_t distance) = 0; // IL
|
|
virtual bool DeleteLine(const size_t distance) = 0; // DL
|
|
virtual bool SetColumns(const size_t columns) = 0; // DECCOLM
|
|
virtual bool SetCursorKeysMode(const bool applicationMode) = 0; // DECCKM
|
|
virtual bool SetKeypadMode(const bool applicationMode) = 0; // DECKPAM, DECKPNM
|
|
virtual bool EnableWin32InputMode(const bool win32InputMode) = 0; // win32-input-mode
|
|
virtual bool EnableCursorBlinking(const bool enable) = 0; // ATT610
|
|
virtual bool SetAnsiMode(const bool ansiMode) = 0; // DECANM
|
|
virtual bool SetScreenMode(const bool reverseMode) = 0; // DECSCNM
|
|
virtual bool SetOriginMode(const bool relativeMode) = 0; // DECOM
|
|
virtual bool SetAutoWrapMode(const bool wrapAtEOL) = 0; // DECAWM
|
|
virtual bool SetTopBottomScrollingMargins(const size_t topMargin, const size_t bottomMargin) = 0; // DECSTBM
|
|
virtual bool WarningBell() = 0; // BEL
|
|
virtual bool CarriageReturn() = 0; // CR
|
|
virtual bool LineFeed(const DispatchTypes::LineFeedType lineFeedType) = 0; // IND, NEL, LF, FF, VT
|
|
virtual bool ReverseLineFeed() = 0; // RI
|
|
virtual bool SetWindowTitle(std::wstring_view title) = 0; // OscWindowTitle
|
|
virtual bool UseAlternateScreenBuffer() = 0; // ASBSET
|
|
virtual bool UseMainScreenBuffer() = 0; // ASBRST
|
|
virtual bool HorizontalTabSet() = 0; // HTS
|
|
virtual bool ForwardTab(const size_t numTabs) = 0; // CHT, HT
|
|
virtual bool BackwardsTab(const size_t numTabs) = 0; // CBT
|
|
virtual bool TabClear(const DispatchTypes::TabClearType clearType) = 0; // TBC
|
|
virtual bool EnableDECCOLMSupport(const bool enabled) = 0; // ?40
|
|
virtual bool EnableVT200MouseMode(const bool enabled) = 0; // ?1000
|
|
virtual bool EnableUTF8ExtendedMouseMode(const bool enabled) = 0; // ?1005
|
|
virtual bool EnableSGRExtendedMouseMode(const bool enabled) = 0; // ?1006
|
|
virtual bool EnableButtonEventMouseMode(const bool enabled) = 0; // ?1002
|
|
virtual bool EnableAnyEventMouseMode(const bool enabled) = 0; // ?1003
|
|
virtual bool EnableAlternateScroll(const bool enabled) = 0; // ?1007
|
|
virtual bool EnableXtermBracketedPasteMode(const bool enabled) = 0; // ?2004
|
|
virtual bool SetColorTableEntry(const size_t tableIndex, const DWORD color) = 0; // OSCColorTable
|
|
virtual bool SetDefaultForeground(const DWORD color) = 0; // OSCDefaultForeground
|
|
virtual bool SetDefaultBackground(const DWORD color) = 0; // OSCDefaultBackground
|
|
|
|
virtual bool EraseInDisplay(const DispatchTypes::EraseType eraseType) = 0; // ED
|
|
virtual bool EraseInLine(const DispatchTypes::EraseType eraseType) = 0; // EL
|
|
virtual bool EraseCharacters(const size_t numChars) = 0; // ECH
|
|
|
|
virtual bool SetGraphicsRendition(const VTParameters options) = 0; // SGR
|
|
virtual bool SetLineRendition(const LineRendition rendition) = 0; // DECSWL, DECDWL, DECDHL
|
|
|
|
virtual bool PushGraphicsRendition(const VTParameters options) = 0; // XTPUSHSGR
|
|
virtual bool PopGraphicsRendition() = 0; // XTPOPSGR
|
|
|
|
virtual bool SetMode(const DispatchTypes::ModeParams param) = 0; // DECSET
|
|
|
|
virtual bool ResetMode(const DispatchTypes::ModeParams param) = 0; // DECRST
|
|
|
|
virtual bool DeviceStatusReport(const DispatchTypes::AnsiStatusType statusType) = 0; // DSR, DSR-OS, DSR-CPR
|
|
virtual bool DeviceAttributes() = 0; // DA1
|
|
virtual bool SecondaryDeviceAttributes() = 0; // DA2
|
|
virtual bool TertiaryDeviceAttributes() = 0; // DA3
|
|
virtual bool Vt52DeviceAttributes() = 0; // VT52 Identify
|
|
virtual bool RequestTerminalParameters(const DispatchTypes::ReportingPermission permission) = 0; // DECREQTPARM
|
|
|
|
virtual bool DesignateCodingSystem(const VTID codingSystem) = 0; // DOCS
|
|
virtual bool Designate94Charset(const size_t gsetNumber, const VTID charset) = 0; // SCS
|
|
virtual bool Designate96Charset(const size_t gsetNumber, const VTID charset) = 0; // SCS
|
|
virtual bool LockingShift(const size_t gsetNumber) = 0; // LS0, LS1, LS2, LS3
|
|
virtual bool LockingShiftRight(const size_t gsetNumber) = 0; // LS1R, LS2R, LS3R
|
|
virtual bool SingleShift(const size_t gsetNumber) = 0; // SS2, SS3
|
|
|
|
virtual bool SoftReset() = 0; // DECSTR
|
|
virtual bool HardReset() = 0; // RIS
|
|
virtual bool ScreenAlignmentPattern() = 0; // DECALN
|
|
|
|
virtual bool SetCursorStyle(const DispatchTypes::CursorStyle cursorStyle) = 0; // DECSCUSR
|
|
virtual bool SetCursorColor(const COLORREF color) = 0; // OSCSetCursorColor, OSCResetCursorColor
|
|
|
|
virtual bool SetClipboard(std::wstring_view content) = 0; // OSCSetClipboard
|
|
|
|
// DTTERM_WindowManipulation
|
|
virtual bool WindowManipulation(const DispatchTypes::WindowManipulationType function,
|
|
const VTParameter parameter1,
|
|
const VTParameter parameter2) = 0;
|
|
|
|
virtual bool AddHyperlink(const std::wstring_view uri, const std::wstring_view params) = 0;
|
|
virtual bool EndHyperlink() = 0;
|
|
|
|
virtual bool DoConEmuAction(const std::wstring_view string) = 0;
|
|
|
|
virtual StringHandler DownloadDRCS(const size_t fontNumber,
|
|
const VTParameter startChar,
|
|
const DispatchTypes::DrcsEraseControl eraseControl,
|
|
const DispatchTypes::DrcsCellMatrix cellMatrix,
|
|
const DispatchTypes::DrcsFontSet fontSet,
|
|
const DispatchTypes::DrcsFontUsage fontUsage,
|
|
const VTParameter cellHeight,
|
|
const DispatchTypes::DrcsCharsetSize charsetSize) = 0; // DECDLD
|
|
|
|
virtual StringHandler RequestSetting() = 0; // DECRQSS
|
|
};
|
|
inline Microsoft::Console::VirtualTerminal::ITermDispatch::~ITermDispatch() {}
|
|
#pragma warning(pop)
|