This is a refactoring of the renderer color calculations to simplify the implementation, and to make it easier to support additional color-altering rendition attributes in the future (e.g. _faint_ and _conceal_). ## References * This is a followup to PRs #3817 and #6809, which introduced additional complexity in the color calculations, and which suggested the need for refactoring. ## Detailed Description of the Pull Request / Additional comments When we added support for `DECSCNM`, that required the foreground and background color lookup methods to be able to return the opposite of what was requested when the reversed mode was set. That made those methods unnecessarily complicated, and I thought we could simplify them considerably just by combining the calculations into a single method that derived both colors at the same time. And since both conhost and Windows Terminal needed to perform the same calculations, it also made sense to move that functionality into the `TextAttribute` class, where it could easily be shared. In general this way of doing things is a bit more efficient. However, it does result in some unnecessary work when only one of the colors is required, as is the case for the gridline painter. So to make that less of an issue, I've reordered the gridline code a bit so it at least avoids looking up the colors when no gridlines are needed. ## Validation Steps Performed Because of the API changes, quite a lot of the unit tests had to be updated. For example instead of verifying colors with two separate calls to `LookupForegroundColor` and `LookupBackgroundColor`, that's now achieved with a single `LookupAttributeColors` call, comparing against a pair of values. The specifics of the tests haven't changed though, and they're all still working as expected. I've also manually confirmed that the various color sequences and rendition attributes are rendering correctly with the new refactoring.
253 lines
8.2 KiB
C++
253 lines
8.2 KiB
C++
/*++
|
|
Copyright (c) Microsoft Corporation
|
|
Licensed under the MIT license.
|
|
|
|
Module Name:
|
|
- settings.hpp
|
|
|
|
Abstract:
|
|
- This module is used for all configurable settings in the console
|
|
|
|
Author(s):
|
|
- Michael Niksa (MiNiksa) 23-Jul-2014
|
|
- Paul Campbell (PaulCam) 23-Jul-2014
|
|
|
|
Revision History:
|
|
- From components of consrv.h
|
|
- This is a reduced/de-duplicated version of settings that were stored in the registry, link files, and in the console information state.
|
|
--*/
|
|
#pragma once
|
|
|
|
#include "../buffer/out/TextAttribute.hpp"
|
|
|
|
// To prevent invisible windows, set a lower threshold on window alpha channel.
|
|
constexpr unsigned short MIN_WINDOW_OPACITY = 0x4D; // 0x4D is approximately 30% visible/opaque (70% transparent). Valid range is 0x00-0xff.
|
|
|
|
#include "ConsoleArguments.hpp"
|
|
#include "../inc/conattrs.hpp"
|
|
|
|
class Settings
|
|
{
|
|
public:
|
|
Settings();
|
|
|
|
void ApplyDesktopSpecificDefaults();
|
|
|
|
void ApplyStartupInfo(const Settings* const pStartupSettings);
|
|
void ApplyCommandlineArguments(const ConsoleArguments& consoleArgs);
|
|
void InitFromStateInfo(_In_ PCONSOLE_STATE_INFO pStateInfo);
|
|
void Validate();
|
|
|
|
CONSOLE_STATE_INFO CreateConsoleStateInfo() const;
|
|
|
|
DWORD GetVirtTermLevel() const;
|
|
void SetVirtTermLevel(const DWORD dwVirtTermLevel);
|
|
|
|
bool IsAltF4CloseAllowed() const;
|
|
void SetAltF4CloseAllowed(const bool fAllowAltF4Close);
|
|
|
|
bool IsReturnOnNewlineAutomatic() const;
|
|
void SetAutomaticReturnOnNewline(const bool fAutoReturnOnNewline);
|
|
|
|
bool IsGridRenderingAllowedWorldwide() const;
|
|
void SetGridRenderingAllowedWorldwide(const bool fGridRenderingAllowed);
|
|
|
|
bool IsScreenReversed() const;
|
|
void SetScreenReversed(const bool fScreenReversed);
|
|
|
|
bool GetFilterOnPaste() const;
|
|
void SetFilterOnPaste(const bool fFilterOnPaste);
|
|
|
|
const std::wstring_view GetLaunchFaceName() const;
|
|
void SetLaunchFaceName(const std::wstring_view launchFaceName);
|
|
|
|
UINT GetCodePage() const;
|
|
void SetCodePage(const UINT uCodePage);
|
|
|
|
UINT GetScrollScale() const;
|
|
void SetScrollScale(const UINT uScrollScale);
|
|
|
|
bool GetTrimLeadingZeros() const;
|
|
void SetTrimLeadingZeros(const bool fTrimLeadingZeros);
|
|
|
|
bool GetEnableColorSelection() const;
|
|
void SetEnableColorSelection(const bool fEnableColorSelection);
|
|
|
|
bool GetLineSelection() const;
|
|
void SetLineSelection(const bool bLineSelection);
|
|
|
|
bool GetWrapText() const;
|
|
void SetWrapText(const bool bWrapText);
|
|
|
|
bool GetCtrlKeyShortcutsDisabled() const;
|
|
void SetCtrlKeyShortcutsDisabled(const bool fCtrlKeyShortcutsDisabled);
|
|
|
|
BYTE GetWindowAlpha() const;
|
|
void SetWindowAlpha(const BYTE bWindowAlpha);
|
|
|
|
DWORD GetHotKey() const;
|
|
void SetHotKey(const DWORD dwHotKey);
|
|
|
|
bool IsStartupTitleIsLinkNameSet() const;
|
|
|
|
DWORD GetStartupFlags() const;
|
|
void SetStartupFlags(const DWORD dwStartupFlags);
|
|
void UnsetStartupFlag(const DWORD dwFlagToUnset);
|
|
|
|
WORD GetFillAttribute() const;
|
|
void SetFillAttribute(const WORD wFillAttribute);
|
|
|
|
WORD GetPopupFillAttribute() const;
|
|
void SetPopupFillAttribute(const WORD wPopupFillAttribute);
|
|
|
|
WORD GetShowWindow() const;
|
|
void SetShowWindow(const WORD wShowWindow);
|
|
|
|
WORD GetReserved() const;
|
|
void SetReserved(const WORD wReserved);
|
|
|
|
COORD GetScreenBufferSize() const;
|
|
void SetScreenBufferSize(const COORD dwScreenBufferSize);
|
|
|
|
COORD GetWindowSize() const;
|
|
void SetWindowSize(const COORD dwWindowSize);
|
|
|
|
bool IsWindowSizePixelsValid() const;
|
|
COORD GetWindowSizePixels() const;
|
|
void SetWindowSizePixels(const COORD dwWindowSizePixels);
|
|
|
|
COORD GetWindowOrigin() const;
|
|
void SetWindowOrigin(const COORD dwWindowOrigin);
|
|
|
|
DWORD GetFont() const;
|
|
void SetFont(const DWORD dwFont);
|
|
|
|
COORD GetFontSize() const;
|
|
void SetFontSize(const COORD dwFontSize);
|
|
|
|
UINT GetFontFamily() const;
|
|
void SetFontFamily(const UINT uFontFamily);
|
|
|
|
UINT GetFontWeight() const;
|
|
void SetFontWeight(const UINT uFontWeight);
|
|
|
|
const WCHAR* const GetFaceName() const;
|
|
bool IsFaceNameSet() const;
|
|
void SetFaceName(const std::wstring_view faceName);
|
|
|
|
UINT GetCursorSize() const;
|
|
void SetCursorSize(const UINT uCursorSize);
|
|
|
|
bool GetFullScreen() const;
|
|
void SetFullScreen(const bool fFullScreen);
|
|
|
|
bool GetQuickEdit() const;
|
|
void SetQuickEdit(const bool fQuickEdit);
|
|
|
|
bool GetInsertMode() const;
|
|
void SetInsertMode(const bool fInsertMode);
|
|
|
|
bool GetAutoPosition() const;
|
|
void SetAutoPosition(const bool fAutoPosition);
|
|
|
|
UINT GetHistoryBufferSize() const;
|
|
void SetHistoryBufferSize(const UINT uHistoryBufferSize);
|
|
|
|
UINT GetNumberOfHistoryBuffers() const;
|
|
void SetNumberOfHistoryBuffers(const UINT uNumberOfHistoryBuffers);
|
|
|
|
bool GetHistoryNoDup() const;
|
|
void SetHistoryNoDup(const bool fHistoryNoDup);
|
|
|
|
std::basic_string_view<COLORREF> Get16ColorTable() const;
|
|
std::basic_string_view<COLORREF> Get256ColorTable() const;
|
|
void SetColorTableEntry(const size_t index, const COLORREF ColorValue);
|
|
COLORREF GetColorTableEntry(const size_t index) const;
|
|
|
|
COLORREF GetCursorColor() const noexcept;
|
|
CursorType GetCursorType() const noexcept;
|
|
|
|
void SetCursorColor(const COLORREF CursorColor) noexcept;
|
|
void SetCursorType(const CursorType cursorType) noexcept;
|
|
|
|
bool GetInterceptCopyPaste() const noexcept;
|
|
void SetInterceptCopyPaste(const bool interceptCopyPaste) noexcept;
|
|
|
|
COLORREF GetDefaultForegroundColor() const noexcept;
|
|
void SetDefaultForegroundColor(const COLORREF defaultForeground) noexcept;
|
|
|
|
COLORREF GetDefaultBackgroundColor() const noexcept;
|
|
void SetDefaultBackgroundColor(const COLORREF defaultBackground) noexcept;
|
|
|
|
bool IsTerminalScrolling() const noexcept;
|
|
void SetTerminalScrolling(const bool terminalScrollingEnabled) noexcept;
|
|
|
|
bool GetUseDx() const noexcept;
|
|
bool GetCopyColor() const noexcept;
|
|
|
|
COLORREF CalculateDefaultForeground() const noexcept;
|
|
COLORREF CalculateDefaultBackground() const noexcept;
|
|
std::pair<COLORREF, COLORREF> LookupAttributeColors(const TextAttribute& attr) const noexcept;
|
|
|
|
private:
|
|
DWORD _dwHotKey;
|
|
DWORD _dwStartupFlags;
|
|
WORD _wFillAttribute;
|
|
WORD _wPopupFillAttribute;
|
|
WORD _wShowWindow; // used when window is created
|
|
WORD _wReserved;
|
|
// START - This section filled via memcpy from shortcut properties. Do not rearrange/change.
|
|
COORD _dwScreenBufferSize;
|
|
COORD _dwWindowSize; // this is in characters.
|
|
COORD _dwWindowOrigin; // used when window is created
|
|
DWORD _nFont;
|
|
COORD _dwFontSize;
|
|
UINT _uFontFamily;
|
|
UINT _uFontWeight;
|
|
WCHAR _FaceName[LF_FACESIZE];
|
|
UINT _uCursorSize;
|
|
BOOL _bFullScreen; // deprecated
|
|
BOOL _bQuickEdit;
|
|
BOOL _bInsertMode; // used by command line editing
|
|
BOOL _bAutoPosition;
|
|
UINT _uHistoryBufferSize;
|
|
UINT _uNumberOfHistoryBuffers;
|
|
BOOL _bHistoryNoDup;
|
|
// END - memcpy
|
|
UINT _uCodePage;
|
|
UINT _uScrollScale;
|
|
bool _fTrimLeadingZeros;
|
|
bool _fEnableColorSelection;
|
|
bool _bLineSelection;
|
|
bool _bWrapText; // whether to use text wrapping when resizing the window
|
|
bool _fCtrlKeyShortcutsDisabled; // disables Ctrl+<something> key intercepts
|
|
BYTE _bWindowAlpha; // describes the opacity of the window
|
|
|
|
bool _fFilterOnPaste; // should we filter text when the user pastes? (e.g. remove <tab>)
|
|
std::wstring _LaunchFaceName;
|
|
bool _fAllowAltF4Close;
|
|
DWORD _dwVirtTermLevel;
|
|
bool _fAutoReturnOnNewline;
|
|
bool _fRenderGridWorldwide;
|
|
bool _fScreenReversed;
|
|
bool _fUseDx;
|
|
bool _fCopyColor;
|
|
|
|
std::array<COLORREF, XTERM_COLOR_TABLE_SIZE> _colorTable;
|
|
|
|
// this is used for the special STARTF_USESIZE mode.
|
|
bool _fUseWindowSizePixels;
|
|
COORD _dwWindowSizePixels;
|
|
|
|
// Technically a COLORREF, but using INVALID_COLOR as "Invert Colors"
|
|
unsigned int _CursorColor;
|
|
CursorType _CursorType;
|
|
|
|
bool _fInterceptCopyPaste;
|
|
|
|
COLORREF _DefaultForeground;
|
|
COLORREF _DefaultBackground;
|
|
bool _TerminalScrolling;
|
|
friend class RegistrySerialization;
|
|
};
|