Standardize color table APIs in ConGetSet and ITerminalApi.
This commit is contained in:
parent
05e20f6ebc
commit
a8bad338a1
|
@ -40,7 +40,8 @@ namespace Microsoft::Terminal::Core
|
|||
virtual bool WarningBell() noexcept = 0;
|
||||
virtual bool SetWindowTitle(std::wstring_view title) noexcept = 0;
|
||||
|
||||
virtual bool SetColorTableEntry(const size_t tableIndex, const DWORD color) noexcept = 0;
|
||||
virtual COLORREF GetColorTableEntry(const size_t tableIndex) const noexcept = 0;
|
||||
virtual bool SetColorTableEntry(const size_t tableIndex, const COLORREF color) noexcept = 0;
|
||||
|
||||
virtual bool SetCursorStyle(const ::Microsoft::Console::VirtualTerminal::DispatchTypes::CursorStyle cursorStyle) noexcept = 0;
|
||||
virtual bool SetCursorColor(const DWORD color) noexcept = 0;
|
||||
|
|
|
@ -106,6 +106,7 @@ public:
|
|||
bool EraseInDisplay(const ::Microsoft::Console::VirtualTerminal::DispatchTypes::EraseType eraseType) noexcept override;
|
||||
bool WarningBell() noexcept override;
|
||||
bool SetWindowTitle(std::wstring_view title) noexcept override;
|
||||
COLORREF GetColorTableEntry(const size_t tableIndex) const noexcept override;
|
||||
bool SetColorTableEntry(const size_t tableIndex, const COLORREF color) noexcept override;
|
||||
bool SetCursorStyle(const ::Microsoft::Console::VirtualTerminal::DispatchTypes::CursorStyle cursorStyle) noexcept override;
|
||||
bool SetCursorColor(const COLORREF color) noexcept override;
|
||||
|
|
|
@ -370,6 +370,22 @@ try
|
|||
}
|
||||
CATCH_RETURN_FALSE()
|
||||
|
||||
// Method Description:
|
||||
// - Retrieves the value in the colortable at the specified index.
|
||||
// Arguments:
|
||||
// - tableIndex: the index of the color table to retrieve.
|
||||
// Return Value:
|
||||
// - the COLORREF value for the color at that index in the table.
|
||||
COLORREF Terminal::GetColorTableEntry(const size_t tableIndex) const noexcept
|
||||
try
|
||||
{
|
||||
return _colorTable.at(tableIndex);
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
return INVALID_COLOR;
|
||||
}
|
||||
|
||||
// Method Description:
|
||||
// - Updates the value in the colortable at index tableIndex to the new color
|
||||
// color. color is a COLORREF, format 0x00BBGGRR.
|
||||
|
|
|
@ -1963,61 +1963,6 @@ void DoSrvPrivateMoveToBottom(SCREEN_INFORMATION& screenInfo)
|
|||
screenInfo.GetActiveBuffer().MoveToBottom();
|
||||
}
|
||||
|
||||
// Method Description:
|
||||
// - Retrieve the color table value at the specified index.
|
||||
// Arguments:
|
||||
// - index: the index in the table to retrieve.
|
||||
// - value: receives the RGB value for the color at that index in the table.
|
||||
// Return Value:
|
||||
// - E_INVALIDARG if index is >= 256, else S_OK
|
||||
[[nodiscard]] HRESULT DoSrvPrivateGetColorTableEntry(const size_t index, COLORREF& value) noexcept
|
||||
{
|
||||
RETURN_HR_IF(E_INVALIDARG, index >= 256);
|
||||
try
|
||||
{
|
||||
Globals& g = ServiceLocator::LocateGlobals();
|
||||
CONSOLE_INFORMATION& gci = g.getConsoleInformation();
|
||||
|
||||
value = gci.GetColorTableEntry(index);
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
CATCH_RETURN();
|
||||
}
|
||||
|
||||
// Method Description:
|
||||
// - Sets the color table value in index to the color specified in value.
|
||||
// Can be used to set the 256-color table as well as the 16-color table.
|
||||
// Arguments:
|
||||
// - index: the index in the table to change.
|
||||
// - value: the new RGB value to use for that index in the color table.
|
||||
// Return Value:
|
||||
// - E_INVALIDARG if index is >= 256, else S_OK
|
||||
// Notes:
|
||||
// Does not take a buffer parameter. The color table for a console and for
|
||||
// terminals as well is global, not per-screen-buffer.
|
||||
[[nodiscard]] HRESULT DoSrvPrivateSetColorTableEntry(const size_t index, const COLORREF value) noexcept
|
||||
{
|
||||
RETURN_HR_IF(E_INVALIDARG, index >= TextColor::TABLE_SIZE);
|
||||
try
|
||||
{
|
||||
Globals& g = ServiceLocator::LocateGlobals();
|
||||
CONSOLE_INFORMATION& gci = g.getConsoleInformation();
|
||||
|
||||
gci.SetColorTableEntry(index, value);
|
||||
|
||||
// Update the screen colors if we're not a pty
|
||||
// No need to force a redraw in pty mode.
|
||||
if (g.pRender && !gci.IsInVtIoMode())
|
||||
{
|
||||
g.pRender->TriggerRedrawAll();
|
||||
}
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
CATCH_RETURN();
|
||||
}
|
||||
|
||||
// Routine Description:
|
||||
// - A private API call for filling a region of the screen buffer.
|
||||
// Arguments:
|
||||
|
|
|
@ -63,9 +63,6 @@ void DoSrvPrivateInsertLines(const size_t count);
|
|||
|
||||
void DoSrvPrivateMoveToBottom(SCREEN_INFORMATION& screenInfo);
|
||||
|
||||
[[nodiscard]] HRESULT DoSrvPrivateGetColorTableEntry(const size_t index, COLORREF& value) noexcept;
|
||||
[[nodiscard]] HRESULT DoSrvPrivateSetColorTableEntry(const size_t index, const COLORREF value) noexcept;
|
||||
|
||||
[[nodiscard]] HRESULT DoSrvPrivateFillRegion(SCREEN_INFORMATION& screenInfo,
|
||||
const COORD startPosition,
|
||||
const size_t fillLength,
|
||||
|
|
|
@ -608,30 +608,50 @@ bool ConhostInternalGetSet::MoveToBottom() const
|
|||
}
|
||||
|
||||
// Method Description:
|
||||
// - Connects the PrivateGetColorTableEntry call directly into our Driver Message servicing
|
||||
// call inside Conhost.exe
|
||||
// - Retrieves the value in the colortable at the specified index.
|
||||
// Arguments:
|
||||
// - index: the index in the table to retrieve.
|
||||
// - value: receives the RGB value for the color at that index in the table.
|
||||
// - tableIndex: the index of the color table to retrieve.
|
||||
// Return Value:
|
||||
// - true if successful (see DoSrvPrivateGetColorTableEntry). false otherwise.
|
||||
bool ConhostInternalGetSet::PrivateGetColorTableEntry(const size_t index, COLORREF& value) const noexcept
|
||||
// - the COLORREF value for the color at that index in the table.
|
||||
COLORREF ConhostInternalGetSet::GetColorTableEntry(const size_t tableIndex) const noexcept
|
||||
try
|
||||
{
|
||||
return SUCCEEDED(DoSrvPrivateGetColorTableEntry(index, value));
|
||||
auto& g = ServiceLocator::LocateGlobals();
|
||||
auto& gci = g.getConsoleInformation();
|
||||
|
||||
return gci.GetColorTableEntry(tableIndex);
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
return INVALID_COLOR;
|
||||
}
|
||||
|
||||
// Method Description:
|
||||
// - Connects the PrivateSetColorTableEntry call directly into our Driver Message servicing
|
||||
// call inside Conhost.exe
|
||||
// - Updates the value in the colortable at index tableIndex to the new color
|
||||
// color. color is a COLORREF, format 0x00BBGGRR.
|
||||
// Arguments:
|
||||
// - index: the index in the table to change.
|
||||
// - value: the new RGB value to use for that index in the color table.
|
||||
// - tableIndex: the index of the color table to update.
|
||||
// - color: the new COLORREF to use as that color table value.
|
||||
// Return Value:
|
||||
// - true if successful (see DoSrvPrivateSetColorTableEntry). false otherwise.
|
||||
bool ConhostInternalGetSet::PrivateSetColorTableEntry(const size_t index, const COLORREF value) const noexcept
|
||||
// - true if successful. false otherwise.
|
||||
bool ConhostInternalGetSet::SetColorTableEntry(const size_t tableIndex, const COLORREF color) noexcept
|
||||
try
|
||||
{
|
||||
return SUCCEEDED(DoSrvPrivateSetColorTableEntry(index, value));
|
||||
auto& g = ServiceLocator::LocateGlobals();
|
||||
auto& gci = g.getConsoleInformation();
|
||||
|
||||
gci.SetColorTableEntry(tableIndex, color);
|
||||
|
||||
// Update the screen colors if we're not a pty
|
||||
// No need to force a redraw in pty mode.
|
||||
if (g.pRender && !gci.IsInVtIoMode())
|
||||
{
|
||||
g.pRender->TriggerRedrawAll();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
CATCH_RETURN_FALSE()
|
||||
|
||||
// Routine Description:
|
||||
// - Connects the PrivateFillRegion call directly into our Driver Message servicing
|
||||
|
|
|
@ -119,8 +119,8 @@ public:
|
|||
|
||||
bool MoveToBottom() const override;
|
||||
|
||||
bool PrivateGetColorTableEntry(const size_t index, COLORREF& value) const noexcept override;
|
||||
bool PrivateSetColorTableEntry(const size_t index, const COLORREF value) const noexcept override;
|
||||
COLORREF GetColorTableEntry(const size_t tableIndex) const noexcept override;
|
||||
bool SetColorTableEntry(const size_t tableIndex, const COLORREF color) noexcept override;
|
||||
|
||||
bool PrivateFillRegion(const COORD startPosition,
|
||||
const size_t fillLength,
|
||||
|
|
|
@ -2273,7 +2273,7 @@ bool AdaptDispatch::SetClipboard(const std::wstring_view /*content*/) noexcept
|
|||
// True if handled successfully. False otherwise.
|
||||
bool AdaptDispatch::SetColorTableEntry(const size_t tableIndex, const DWORD dwColor)
|
||||
{
|
||||
const bool success = _pConApi->PrivateSetColorTableEntry(tableIndex, dwColor);
|
||||
const bool success = _pConApi->SetColorTableEntry(tableIndex, dwColor);
|
||||
|
||||
// If we're a conpty, always return false, so that we send the updated color
|
||||
// value to the terminal. Still handle the sequence so apps that use
|
||||
|
@ -2296,7 +2296,7 @@ bool AdaptDispatch::SetColorTableEntry(const size_t tableIndex, const DWORD dwCo
|
|||
bool AdaptDispatch::SetDefaultForeground(const DWORD dwColor)
|
||||
{
|
||||
bool success = true;
|
||||
success = _pConApi->PrivateSetColorTableEntry(TextColor::DEFAULT_FOREGROUND, dwColor);
|
||||
success = _pConApi->SetColorTableEntry(TextColor::DEFAULT_FOREGROUND, dwColor);
|
||||
|
||||
// If we're a conpty, always return false, so that we send the updated color
|
||||
// value to the terminal. Still handle the sequence so apps that use
|
||||
|
@ -2319,7 +2319,7 @@ bool AdaptDispatch::SetDefaultForeground(const DWORD dwColor)
|
|||
bool AdaptDispatch::SetDefaultBackground(const DWORD dwColor)
|
||||
{
|
||||
bool success = true;
|
||||
success = _pConApi->PrivateSetColorTableEntry(TextColor::DEFAULT_BACKGROUND, dwColor);
|
||||
success = _pConApi->SetColorTableEntry(TextColor::DEFAULT_BACKGROUND, dwColor);
|
||||
|
||||
// If we're a conpty, always return false, so that we send the updated color
|
||||
// value to the terminal. Still handle the sequence so apps that use
|
||||
|
|
|
@ -87,8 +87,8 @@ namespace Microsoft::Console::VirtualTerminal
|
|||
|
||||
virtual bool MoveToBottom() const = 0;
|
||||
|
||||
virtual bool PrivateGetColorTableEntry(const size_t index, COLORREF& value) const = 0;
|
||||
virtual bool PrivateSetColorTableEntry(const size_t index, const COLORREF value) const = 0;
|
||||
virtual COLORREF GetColorTableEntry(const size_t tableIndex) const = 0;
|
||||
virtual bool SetColorTableEntry(const size_t tableIndex, const COLORREF color) = 0;
|
||||
|
||||
virtual bool PrivateFillRegion(const COORD startPosition,
|
||||
const size_t fillLength,
|
||||
|
|
|
@ -438,31 +438,31 @@ public:
|
|||
return _moveToBottomResult;
|
||||
}
|
||||
|
||||
bool PrivateGetColorTableEntry(const size_t index, COLORREF& value) const noexcept override
|
||||
COLORREF GetColorTableEntry(const size_t tableIndex) const noexcept override
|
||||
{
|
||||
Log::Comment(L"PrivateGetColorTableEntry MOCK called...");
|
||||
Log::Comment(L"GetColorTableEntry MOCK called...");
|
||||
|
||||
if (_privateGetColorTableEntryResult)
|
||||
if (_getColorTableEntryResult)
|
||||
{
|
||||
VERIFY_ARE_EQUAL(_expectedColorTableIndex, index);
|
||||
VERIFY_ARE_EQUAL(_expectedColorTableIndex, tableIndex);
|
||||
// Simply returning the index as the color value makes it easy for
|
||||
// tests to confirm that they've received the color they expected.
|
||||
value = gsl::narrow_cast<COLORREF>(index);
|
||||
return gsl::narrow_cast<COLORREF>(tableIndex);
|
||||
}
|
||||
|
||||
return _privateGetColorTableEntryResult;
|
||||
return INVALID_COLOR;
|
||||
}
|
||||
|
||||
bool PrivateSetColorTableEntry(const size_t index, const COLORREF value) const noexcept override
|
||||
bool SetColorTableEntry(const size_t tableIndex, const COLORREF color) noexcept override
|
||||
{
|
||||
Log::Comment(L"PrivateSetColorTableEntry MOCK called...");
|
||||
if (_privateSetColorTableEntryResult)
|
||||
Log::Comment(L"SetColorTableEntry MOCK called...");
|
||||
if (_setColorTableEntryResult)
|
||||
{
|
||||
VERIFY_ARE_EQUAL(_expectedColorTableIndex, index);
|
||||
VERIFY_ARE_EQUAL(_expectedColorValue, value);
|
||||
VERIFY_ARE_EQUAL(_expectedColorTableIndex, tableIndex);
|
||||
VERIFY_ARE_EQUAL(_expectedColorValue, color);
|
||||
}
|
||||
|
||||
return _privateSetColorTableEntryResult;
|
||||
return _setColorTableEntryResult;
|
||||
}
|
||||
|
||||
bool PrivateFillRegion(const COORD /*startPosition*/,
|
||||
|
@ -723,8 +723,8 @@ public:
|
|||
bool _getConsoleOutputCPResult = false;
|
||||
bool _moveToBottomResult = false;
|
||||
|
||||
bool _privateGetColorTableEntryResult = false;
|
||||
bool _privateSetColorTableEntryResult = false;
|
||||
bool _getColorTableEntryResult = false;
|
||||
bool _setColorTableEntryResult = false;
|
||||
size_t _expectedColorTableIndex = SIZE_MAX;
|
||||
COLORREF _expectedColorValue = INVALID_COLOR;
|
||||
|
||||
|
@ -2278,7 +2278,7 @@ public:
|
|||
VTParameter rgOptions[16];
|
||||
size_t cOptions = 3;
|
||||
|
||||
_testGetSet->_privateGetColorTableEntryResult = true;
|
||||
_testGetSet->_getColorTableEntryResult = true;
|
||||
_testGetSet->_expectedAttribute = _testGetSet->_attribute;
|
||||
|
||||
Log::Comment(L"Test 1: Change Foreground");
|
||||
|
@ -2328,7 +2328,7 @@ public:
|
|||
|
||||
VTParameter rgOptions[16];
|
||||
|
||||
_testGetSet->_privateGetColorTableEntryResult = true;
|
||||
_testGetSet->_getColorTableEntryResult = true;
|
||||
_testGetSet->_expectedAttribute = _testGetSet->_attribute;
|
||||
|
||||
Log::Comment(L"Test 1: Change Indexed Foreground with missing index parameter");
|
||||
|
@ -2371,7 +2371,7 @@ public:
|
|||
{
|
||||
_testGetSet->PrepData();
|
||||
|
||||
_testGetSet->_privateSetColorTableEntryResult = true;
|
||||
_testGetSet->_setColorTableEntryResult = true;
|
||||
const auto testColor = RGB(1, 2, 3);
|
||||
_testGetSet->_expectedColorValue = testColor;
|
||||
|
||||
|
@ -2381,7 +2381,7 @@ public:
|
|||
VERIFY_IS_TRUE(_pDispatch.get()->SetColorTableEntry(i, testColor));
|
||||
}
|
||||
|
||||
// Test in pty mode - we should fail, but PrivateSetColorTableEntry should still be called
|
||||
// Test in pty mode - we should fail, but SetColorTableEntry should still be called
|
||||
_testGetSet->_isPty = true;
|
||||
|
||||
_testGetSet->_expectedColorTableIndex = 15; // Windows BRIGHT_WHITE
|
||||
|
|
Loading…
Reference in a new issue