Compare commits
61 commits
main
...
dev/migrie
Author | SHA1 | Date | |
---|---|---|---|
d675fd824a | |||
b421ee6ca0 | |||
a1bfa332f3 | |||
8313987490 | |||
efdc0909e8 | |||
7bb8975953 | |||
8532dd692e | |||
a338ca168c | |||
5adb327703 | |||
1a7649ce21 | |||
a9e706c573 | |||
2a18d7dae3 | |||
ae833a77bd | |||
88f2e64bb3 | |||
6e8a2adbd9 | |||
59c193c22a | |||
713f72e1e5 | |||
5cd8096d42 | |||
147101f833 | |||
5173ea30f5 | |||
9eeea4a9d0 | |||
d51c2cff35 | |||
83e7aead57 | |||
6da5d79d47 | |||
51486a4168 | |||
f111c6d72d | |||
f087dd8236 | |||
bf9bf0e138 | |||
7c288517a5 | |||
8c7ce77811 | |||
01cef2f3dc | |||
4a700cd1cc | |||
217742c1ff | |||
48ca704816 | |||
634b6854dc | |||
28cbad1470 | |||
94f4ef5601 | |||
6babb4e73a | |||
282c03c374 | |||
916096643e | |||
e3a50cfdee | |||
1aa2849d94 | |||
17829f438b | |||
888e1572d2 | |||
4912b65967 | |||
03711944f1 | |||
70b9f8ce5f | |||
a9de82e4ee | |||
4f7e883673 | |||
31e799859f | |||
1413d0145a | |||
fbba74e89b | |||
4a1baf0006 | |||
c26dd6b1db | |||
c7536edfa8 | |||
7fc2f10bbd | |||
4b18bb415e | |||
d6989ec9d1 | |||
981d8cc9c8 | |||
dad065e0fe | |||
43ec102343 |
19
.github/ISSUE_TEMPLATE/Bug_Report.yml
vendored
19
.github/ISSUE_TEMPLATE/Bug_Report.yml
vendored
|
@ -10,21 +10,14 @@ body:
|
|||
|
||||
- type: input
|
||||
attributes:
|
||||
label: Windows Terminal version
|
||||
placeholder: "1.7.3651.0"
|
||||
label: Windows Terminal version (or Windows build number)
|
||||
placeholder: "10.0.19042.0, 1.7.3651.0"
|
||||
description: |
|
||||
You can find the version in the about dialog, or by running `wt -v` at the commandline.
|
||||
If you are reporting an issue in Windows Terminal, you can find the version in the about dialog.
|
||||
|
||||
If you are reporting an issue with the Windows Console, please run `ver` or `[Environment]::OSVersion`.
|
||||
validations:
|
||||
required: false
|
||||
|
||||
- type: input
|
||||
attributes:
|
||||
label: Windows build number
|
||||
placeholder: "10.0.19042.0"
|
||||
description: |
|
||||
Please run `ver` or `[Environment]::OSVersion`.
|
||||
validations:
|
||||
required: false
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
|
|
1
.github/actions/spelling/allow/allow.txt
vendored
1
.github/actions/spelling/allow/allow.txt
vendored
|
@ -32,7 +32,6 @@ hyperlink
|
|||
hyperlinking
|
||||
hyperlinks
|
||||
img
|
||||
inlined
|
||||
It'd
|
||||
kje
|
||||
liga
|
||||
|
|
1
.github/actions/spelling/allow/apis.txt
vendored
1
.github/actions/spelling/allow/apis.txt
vendored
|
@ -169,7 +169,6 @@ toupper
|
|||
TTask
|
||||
TVal
|
||||
UChar
|
||||
UFIELD
|
||||
ULARGE
|
||||
UPDATEINIFILE
|
||||
userenv
|
||||
|
|
1
.github/actions/spelling/expect/expect.txt
vendored
1
.github/actions/spelling/expect/expect.txt
vendored
|
@ -508,7 +508,6 @@ dealloc
|
|||
Debian
|
||||
debolden
|
||||
debugtype
|
||||
DECAC
|
||||
DECALN
|
||||
DECANM
|
||||
DECAUPSS
|
||||
|
|
|
@ -4,7 +4,7 @@ https://www\.itscj\.ipsj\.or\.jp/iso-ir/[-0-9]+\.pdf
|
|||
https://www\.vt100\.net/docs/[-a-zA-Z0-9#_\/.]*
|
||||
https://www.w3.org/[-a-zA-Z0-9?&=\/_#]*
|
||||
https://(?:(?:www\.|)youtube\.com|youtu.be)/[-a-zA-Z0-9?&=]*
|
||||
https://(?:[a-z-]+\.|)github(?:usercontent|)\.com/[-a-zA-Z0-9?%&=_\/.+]*
|
||||
https://(?:[a-z-]+\.|)github(?:usercontent|)\.com/[-a-zA-Z0-9?%&=_\/.]*
|
||||
https://www.xfree86.org/[-a-zA-Z0-9?&=\/_#]*
|
||||
[Pp]ublicKeyToken="?[0-9a-fA-F]{16}"?
|
||||
(?:[{"]|UniqueIdentifier>)[0-9a-fA-F]{8}-(?:[0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}(?:[}"]|</UniqueIdentifier)
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
"Microsoft.Net.Component.4.5.TargetingPack",
|
||||
"Microsoft.VisualStudio.Component.DiagnosticTools",
|
||||
"Microsoft.VisualStudio.Component.Debugger.JustInTime",
|
||||
"Microsoft.VisualStudio.Component.Windows10SDK.22000",
|
||||
"Microsoft.VisualStudio.Component.Windows10SDK.19041",
|
||||
"Microsoft.VisualStudio.ComponentGroup.UWP.Support",
|
||||
"Microsoft.VisualStudio.Component.VC.CoreIde",
|
||||
"Microsoft.VisualStudio.ComponentGroup.NativeDesktop.Core",
|
||||
|
|
|
@ -99,29 +99,15 @@ If you don't have any additional info/context to add but would like to indicate
|
|||
|
||||
## Contributing fixes / features
|
||||
|
||||
If you're able & willing to help fix issues and/or implement features, we'd love your contribution!
|
||||
|
||||
The best place to start is the list of ["Easy Starter"](https://github.com/microsoft/terminal/issues?q=is%3Aopen+is%3Aissue+label%3A%22Help+Wanted%22+label%3A%22Easy+Starter%22+) issues. These are bugs or tasks that we on the team believe would be easier to implement for someone without any prior experience in the codebase. Once you're feeling more comfortable in the codebase, feel free to just use the ["Help Wanted"](https://github.com/microsoft/terminal/issues?q=is%3Aopen+is%3Aissue+label%3A%22Help+Wanted%22+) label, or just find an issue your interested in and hop in!
|
||||
|
||||
Generally, we categorize issues in the following way, which is largely derived from our old internal work tracking system:
|
||||
* ["Bugs"](https://github.com/microsoft/terminal/issues?q=is%3Aopen+is%3Aissue+label%3A%22Issue-Bug%22+) are parts of the Terminal & Console that are not quite working the right way. There's code to already support some scenario, but it's not quite working right. Fixing these is generally a matter of debugging the broken functionality and fixing the wrong code.
|
||||
* ["Tasks"](https://github.com/microsoft/terminal/issues?q=is%3Aopen+is%3Aissue+label%3A%22Issue-Task%22+) are usually new pieces of functionality that aren't yet implemented for the Terminal/Console. These are usually smaller features, which we believe
|
||||
- could be a single, atomic PR
|
||||
- Don't require much design consideration, or we've already written the spec for the larger feature they belong to.
|
||||
* ["Features"](https://github.com/microsoft/terminal/issues?q=is%3Aopen+is%3Aissue+label%3A%22Issue-Feature%22+) are larger pieces of new functionality. These are usually things we believe would require larger discussion of how they should be implemented, or they'll require some complicated new settings. They might just be features that are composed of many individual tasks. Often times, with features, we like to have a spec written before development work is started, to make sure we're all on the same page (see below).
|
||||
|
||||
Bugs and tasks are obviously the easiest to get started with, but don't feel afraid of features either! We've had some community members contribute some amazing "feature"-level work to the Terminal (albeit, with lots of discussion 😄).
|
||||
|
||||
|
||||
Often, we like to assign issues that generally belong to somebody's area of expertise to the team member that owns that area. This doesn't mean the community can't jump in -- they should reach out and have a chat with the assignee to see if it'd okay to take. If an issue's been assigned more than a month ago, there's a good chance it's fair game to try yourself.
|
||||
For those able & willing to help fix issues and/or implement features ...
|
||||
|
||||
### To Spec or not to Spec
|
||||
|
||||
Some issues/features may be quick and simple to describe and understand. For such scenarios, once a team member has agreed with your approach, skip ahead to the section headed "Fork, Branch, and Create your PR", below.
|
||||
|
||||
Small issues that do not require a spec will be labelled `Issue-Bug` or `Issue-Task`.
|
||||
Small issues that do not require a spec will be labelled Issue-Bug or Issue-Task.
|
||||
|
||||
However, some issues/features will require careful thought & formal design before implementation. For these scenarios, we'll request that a spec is written and the associated issue will be labeled `Issue-Feature`. More often than not, we'll add such features to the ["Specification Tracker" project](https://github.com/microsoft/terminal/projects/1).
|
||||
However, some issues/features will require careful thought & formal design before implementation. For these scenarios, we'll request that a spec is written and the associated issue will be labeled Issue-Feature.
|
||||
|
||||
Specs help collaborators discuss different approaches to solve a problem, describe how the feature will behave, how the feature will impact the user, what happens if something goes wrong, etc. Driving towards agreement in a spec, before any code is written, often results in simpler code, and less wasted effort in the long run.
|
||||
|
||||
|
|
|
@ -63,14 +63,8 @@
|
|||
Outputs="$(OpenConsoleCommonOutDir)\inc\TilFeatureStaging.h"
|
||||
DependsOnTargets="_GenerateBranchAndBrandingCache">
|
||||
<MakeDir Directories="$(OpenConsoleCommonOutDir)\inc" />
|
||||
<!-- This commandline is escaped like:
|
||||
|
||||
powershell -Command "&'$(SolutionDir)\tools\Generate-FeatureStagingHeader.ps1' -Path '%(FeatureFlagFile.FullPath)'' -Branding $(_WTBrandingName)"
|
||||
|
||||
which was the only way I could find to get it to obey spaces in the SolutionDir
|
||||
-->
|
||||
<Exec
|
||||
Command="powershell -NoLogo -NoProfile -NonInteractive -ExecutionPolicy ByPass -Command "&'$(SolutionDir)\tools\Generate-FeatureStagingHeader.ps1' -Path '%(FeatureFlagFile.FullPath)' -Branding $(_WTBrandingName)""
|
||||
Command="powershell -NoLogo -NoProfile -NonInteractive -ExecutionPolicy ByPass -Command "$(SolutionDir)\tools\Generate-FeatureStagingHeader.ps1" -Path "%(FeatureFlagFile.FullPath)" -Branding $(_WTBrandingName)"
|
||||
ConsoleToMsBuild="true"
|
||||
StandardOutputImportance="low">
|
||||
<Output TaskParameter="ConsoleOutput" ItemName="_FeatureFlagFileLines" />
|
||||
|
|
|
@ -22,7 +22,7 @@ Param(
|
|||
[Parameter(HelpMessage="Path to makeappx.exe")]
|
||||
[ValidateScript({Test-Path $_ -Type Leaf})]
|
||||
[string]
|
||||
$MakeAppxPath = "C:\Program Files (x86)\Windows Kits\10\bin\10.0.22000.0\x86\MakeAppx.exe"
|
||||
$MakeAppxPath = "C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\x86\MakeAppx.exe"
|
||||
)
|
||||
|
||||
If ($null -Eq (Get-Item $MakeAppxPath -EA:SilentlyContinue)) {
|
||||
|
|
|
@ -8,7 +8,7 @@ Param(
|
|||
[Parameter(HelpMessage="Path to Windows Kit")]
|
||||
[ValidateScript({Test-Path $_ -Type Leaf})]
|
||||
[string]
|
||||
$WindowsKitPath = "C:\Program Files (x86)\Windows Kits\10\bin\10.0.22000.0"
|
||||
$WindowsKitPath = "C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0"
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
|
|
|
@ -380,7 +380,7 @@ Here's the AppxManifest we're using:
|
|||
</Properties>
|
||||
|
||||
<Dependencies>
|
||||
<TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.18362.0" MaxVersionTested="10.0.22000.0" />
|
||||
<TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.18362.0" MaxVersionTested="10.0.19041.0" />
|
||||
<PackageDependency Name="Microsoft.VCLibs.140.00.Debug" MinVersion="14.0.27023.1" Publisher="CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US" />
|
||||
<PackageDependency Name="Microsoft.VCLibs.140.00.Debug.UWPDesktop" MinVersion="14.0.27027.1" Publisher="CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US" />
|
||||
</Dependencies>
|
||||
|
@ -517,7 +517,7 @@ This is because of a few key lines we already put in the appxmanifest:
|
|||
|
||||
```xml
|
||||
<Dependencies>
|
||||
<TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.18362.0" MaxVersionTested="10.0.22000.0" />
|
||||
<TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.18362.0" MaxVersionTested="10.0.19041.0" />
|
||||
<PackageDependency Name="Microsoft.VCLibs.140.00.Debug" MinVersion="14.0.27023.1" Publisher="CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US" />
|
||||
<PackageDependency Name="Microsoft.VCLibs.140.00.Debug.UWPDesktop" MinVersion="14.0.27027.1" Publisher="CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US" />
|
||||
</Dependencies>
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
<ProjectGuid>{96274800-9574-423E-892A-909FBE2AC8BE}</ProjectGuid>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<RootNamespace>EchoCon</RootNamespace>
|
||||
<WindowsTargetPlatformVersion>10.0.22000.0</WindowsTargetPlatformVersion>
|
||||
<WindowsTargetPlatformVersion>10.0.19041.0</WindowsTargetPlatformVersion>
|
||||
<WindowsTargetPlatformMinVersion>10.0.17763.0</WindowsTargetPlatformMinVersion>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
|
@ -163,4 +163,4 @@
|
|||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
</Project>
|
|
@ -27,7 +27,7 @@
|
|||
</Properties>
|
||||
|
||||
<Dependencies>
|
||||
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.18362.0" MaxVersionTested="10.0.22000.0" />
|
||||
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.18362.0" MaxVersionTested="10.0.19041.0" />
|
||||
</Dependencies>
|
||||
|
||||
<Resources>
|
||||
|
|
|
@ -118,23 +118,6 @@
|
|||
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
|
||||
</PropertyGroup>
|
||||
|
||||
<!--
|
||||
BODGY
|
||||
|
||||
The wapproj `GetResolvedWinMD` target tries to get a winmd from every cppwinrt
|
||||
executable we put in the package. But we DON'T produce a winmd. This makes the
|
||||
FastUpToDate check fail every time, and leads to the whole wapproj build
|
||||
running even if you're just f5'ing the package. EVEN AFTER A SUCCESSFUL BUILD.
|
||||
|
||||
Setting GenerateWindowsMetadata=false is enough to tell the build system that
|
||||
we don't produce one, and get it off our backs.
|
||||
-->
|
||||
<ItemDefinitionGroup>
|
||||
<Link>
|
||||
<GenerateWindowsMetadata>false</GenerateWindowsMetadata>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
|
||||
<Import Project="$(OpenConsoleDir)src\cppwinrt.build.post.props" />
|
||||
|
||||
<Import Project="..\..\..\packages\Microsoft.UI.Xaml.2.7.0-prerelease.210913003\build\native\Microsoft.UI.Xaml.targets" Condition="Exists('..\..\..\packages\Microsoft.UI.Xaml.2.7.0-prerelease.210913003\build\native\Microsoft.UI.Xaml.targets')" />
|
||||
|
|
|
@ -128,22 +128,22 @@ bool TextAttribute::IsLegacy() const noexcept
|
|||
// - Calculates rgb colors based off of current color table and active modification attributes.
|
||||
// Arguments:
|
||||
// - colorTable: the current color table rgb values.
|
||||
// - defaultFgIndex: the color table index of the default foreground color.
|
||||
// - defaultBgIndex: the color table index of the default background color.
|
||||
// - defaultFgColor: the default foreground color rgb value.
|
||||
// - defaultBgColor: the default background color rgb value.
|
||||
// - reverseScreenMode: true if the screen mode is reversed.
|
||||
// - blinkingIsFaint: true if blinking should be interpreted as faint. (defaults to false)
|
||||
// - boldIsBright: true if "bold" should be interpreted as bright. (defaults to true)
|
||||
// Return Value:
|
||||
// - the foreground and background colors that should be displayed.
|
||||
std::pair<COLORREF, COLORREF> TextAttribute::CalculateRgbColors(const std::array<COLORREF, TextColor::TABLE_SIZE>& colorTable,
|
||||
const size_t defaultFgIndex,
|
||||
const size_t defaultBgIndex,
|
||||
std::pair<COLORREF, COLORREF> TextAttribute::CalculateRgbColors(const std::array<COLORREF, 256>& colorTable,
|
||||
const COLORREF defaultFgColor,
|
||||
const COLORREF defaultBgColor,
|
||||
const bool reverseScreenMode,
|
||||
const bool blinkingIsFaint,
|
||||
const bool boldIsBright) const noexcept
|
||||
{
|
||||
auto fg = _foreground.GetColor(colorTable, defaultFgIndex, boldIsBright && IsBold());
|
||||
auto bg = _background.GetColor(colorTable, defaultBgIndex);
|
||||
auto fg = _foreground.GetColor(colorTable, defaultFgColor, boldIsBright && IsBold());
|
||||
auto bg = _background.GetColor(colorTable, defaultBgColor);
|
||||
if (IsFaint() || (IsBlinking() && blinkingIsFaint))
|
||||
{
|
||||
fg = (fg >> 1) & 0x7F7F7F; // Divide foreground color components by two.
|
||||
|
|
|
@ -64,9 +64,9 @@ public:
|
|||
static TextAttribute StripErroneousVT16VersionsOfLegacyDefaults(const TextAttribute& attribute) noexcept;
|
||||
WORD GetLegacyAttributes() const noexcept;
|
||||
|
||||
std::pair<COLORREF, COLORREF> CalculateRgbColors(const std::array<COLORREF, TextColor::TABLE_SIZE>& colorTable,
|
||||
const size_t defaultFgIndex,
|
||||
const size_t defaultBgIndex,
|
||||
std::pair<COLORREF, COLORREF> CalculateRgbColors(const std::array<COLORREF, 256>& colorTable,
|
||||
const COLORREF defaultFgColor,
|
||||
const COLORREF defaultBgColor,
|
||||
const bool reverseScreenMode = false,
|
||||
const bool blinkingIsFaint = false,
|
||||
const bool boldIsBright = true) const noexcept;
|
||||
|
|
|
@ -139,16 +139,14 @@ void TextColor::SetDefault() noexcept
|
|||
// Arguments:
|
||||
// - colorTable: The table of colors we should use to look up the value of
|
||||
// an indexed attribute from.
|
||||
// - defaultIndex: The color table index to use if we're a default attribute.
|
||||
// - defaultColor: The color value to use if we're a default attribute.
|
||||
// - brighten: if true, we'll brighten a dark color table index.
|
||||
// Return Value:
|
||||
// - a COLORREF containing the real value of this TextColor.
|
||||
COLORREF TextColor::GetColor(const std::array<COLORREF, TextColor::TABLE_SIZE>& colorTable, const size_t defaultIndex, bool brighten) const noexcept
|
||||
COLORREF TextColor::GetColor(const std::array<COLORREF, 256>& colorTable, const COLORREF defaultColor, bool brighten) const noexcept
|
||||
{
|
||||
if (IsDefault())
|
||||
{
|
||||
const auto defaultColor = til::at(colorTable, defaultIndex);
|
||||
|
||||
if (brighten)
|
||||
{
|
||||
// See MSFT:20266024 for context on this fix.
|
||||
|
|
|
@ -65,11 +65,6 @@ public:
|
|||
static constexpr BYTE BRIGHT_CYAN = 14;
|
||||
static constexpr BYTE BRIGHT_WHITE = 15;
|
||||
|
||||
static constexpr size_t DEFAULT_FOREGROUND = 256;
|
||||
static constexpr size_t DEFAULT_BACKGROUND = 257;
|
||||
static constexpr size_t CURSOR_COLOR = 258;
|
||||
static constexpr size_t TABLE_SIZE = 259;
|
||||
|
||||
constexpr TextColor() noexcept :
|
||||
_meta{ ColorType::IsDefault },
|
||||
_red{ 0 },
|
||||
|
@ -108,7 +103,7 @@ public:
|
|||
void SetIndex(const BYTE index, const bool isIndex256) noexcept;
|
||||
void SetDefault() noexcept;
|
||||
|
||||
COLORREF GetColor(const std::array<COLORREF, TABLE_SIZE>& colorTable, const size_t defaultIndex, bool brighten = false) const noexcept;
|
||||
COLORREF GetColor(const std::array<COLORREF, 256>& colorTable, const COLORREF defaultColor, bool brighten = false) const noexcept;
|
||||
BYTE GetLegacyIndex(const BYTE defaultIndex) const noexcept;
|
||||
|
||||
constexpr BYTE GetIndex() const noexcept
|
||||
|
|
|
@ -27,7 +27,9 @@ Cursor::Cursor(const ULONG ulSize, TextBuffer& parentBuffer) noexcept :
|
|||
_fDeferCursorRedraw(false),
|
||||
_fHaveDeferredCursorRedraw(false),
|
||||
_ulSize(ulSize),
|
||||
_cursorType(CursorType::Legacy)
|
||||
_cursorType(CursorType::Legacy),
|
||||
_fUseColor(false),
|
||||
_color(s_InvertCursorColor)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -141,9 +143,10 @@ void Cursor::SetSize(const ULONG ulSize) noexcept
|
|||
_RedrawCursor();
|
||||
}
|
||||
|
||||
void Cursor::SetStyle(const ULONG ulSize, const CursorType type) noexcept
|
||||
void Cursor::SetStyle(const ULONG ulSize, const COLORREF color, const CursorType type) noexcept
|
||||
{
|
||||
_ulSize = ulSize;
|
||||
_color = color;
|
||||
_cursorType = type;
|
||||
|
||||
_RedrawCursor();
|
||||
|
@ -282,6 +285,7 @@ void Cursor::CopyProperties(const Cursor& OtherCursor) noexcept
|
|||
// Size will be handled separately in the resize operation.
|
||||
//_ulSize = OtherCursor._ulSize;
|
||||
_cursorType = OtherCursor._cursorType;
|
||||
_color = OtherCursor._color;
|
||||
}
|
||||
|
||||
void Cursor::DelayEOLWrap(const COORD coordDelayedAt) noexcept
|
||||
|
@ -331,6 +335,21 @@ const CursorType Cursor::GetType() const noexcept
|
|||
return _cursorType;
|
||||
}
|
||||
|
||||
const bool Cursor::IsUsingColor() const noexcept
|
||||
{
|
||||
return GetColor() != INVALID_COLOR;
|
||||
}
|
||||
|
||||
const COLORREF Cursor::GetColor() const noexcept
|
||||
{
|
||||
return _color;
|
||||
}
|
||||
|
||||
void Cursor::SetColor(const unsigned int color) noexcept
|
||||
{
|
||||
_color = gsl::narrow_cast<COLORREF>(color);
|
||||
}
|
||||
|
||||
void Cursor::SetType(const CursorType type) noexcept
|
||||
{
|
||||
_cursorType = type;
|
||||
|
|
|
@ -24,6 +24,7 @@ class TextBuffer;
|
|||
class Cursor final
|
||||
{
|
||||
public:
|
||||
static const unsigned int s_InvertCursorColor = INVALID_COLOR;
|
||||
// the following values are used to create the textmode cursor.
|
||||
static constexpr unsigned int CURSOR_SMALL_SIZE = 25; // large enough to be one pixel on a six pixel font
|
||||
|
||||
|
@ -50,6 +51,8 @@ public:
|
|||
COORD GetPosition() const noexcept;
|
||||
|
||||
const CursorType GetType() const noexcept;
|
||||
const bool IsUsingColor() const noexcept;
|
||||
const COLORREF GetColor() const noexcept;
|
||||
|
||||
void StartDeferDrawing() noexcept;
|
||||
bool IsDeferDrawing() noexcept;
|
||||
|
@ -64,7 +67,7 @@ public:
|
|||
void SetIsPopupShown(const bool fIsPopupShown) noexcept;
|
||||
void SetDelay(const bool fDelay) noexcept;
|
||||
void SetSize(const ULONG ulSize) noexcept;
|
||||
void SetStyle(const ULONG ulSize, const CursorType type) noexcept;
|
||||
void SetStyle(const ULONG ulSize, const COLORREF color, const CursorType type) noexcept;
|
||||
|
||||
void SetPosition(const COORD cPosition) noexcept;
|
||||
void SetXPosition(const int NewX) noexcept;
|
||||
|
@ -81,6 +84,7 @@ public:
|
|||
COORD GetDelayedAtPosition() const noexcept;
|
||||
bool IsDelayedEOLWrap() const noexcept;
|
||||
|
||||
void SetColor(const unsigned int color) noexcept;
|
||||
void SetType(const CursorType type) noexcept;
|
||||
|
||||
private:
|
||||
|
@ -113,4 +117,6 @@ private:
|
|||
void _RedrawCursorAlways() noexcept;
|
||||
|
||||
CursorType _cursorType;
|
||||
bool _fUseColor;
|
||||
COLORREF _color;
|
||||
};
|
||||
|
|
|
@ -24,11 +24,9 @@ class TextAttributeTests
|
|||
TEST_METHOD(TestRoundtripDefaultColors);
|
||||
TEST_METHOD(TestBoldAsBright);
|
||||
|
||||
std::array<COLORREF, TextColor::TABLE_SIZE> _colorTable;
|
||||
const COLORREF _defaultFg = RGB(1, 2, 3);
|
||||
const COLORREF _defaultBg = RGB(4, 5, 6);
|
||||
const size_t _defaultFgIndex = TextColor::DEFAULT_FOREGROUND;
|
||||
const size_t _defaultBgIndex = TextColor::DEFAULT_BACKGROUND;
|
||||
std::array<COLORREF, 256> _colorTable;
|
||||
COLORREF _defaultFg = RGB(1, 2, 3);
|
||||
COLORREF _defaultBg = RGB(4, 5, 6);
|
||||
};
|
||||
|
||||
bool TextAttributeTests::ClassSetup()
|
||||
|
@ -49,8 +47,6 @@ bool TextAttributeTests::ClassSetup()
|
|||
_colorTable[13] = RGB(180, 0, 158); // Bright Magenta
|
||||
_colorTable[14] = RGB(249, 241, 165); // Bright Yellow
|
||||
_colorTable[15] = RGB(242, 242, 242); // White
|
||||
_colorTable[_defaultFgIndex] = _defaultFg;
|
||||
_colorTable[_defaultBgIndex] = _defaultBg;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -136,17 +132,17 @@ void TextAttributeTests::TestTextAttributeColorGetters()
|
|||
// values when reverse video is not set
|
||||
VERIFY_IS_FALSE(attr.IsReverseVideo());
|
||||
|
||||
VERIFY_ARE_EQUAL(red, attr.GetForeground().GetColor(_colorTable, _defaultFgIndex));
|
||||
VERIFY_ARE_EQUAL(green, attr.GetBackground().GetColor(_colorTable, _defaultBgIndex));
|
||||
VERIFY_ARE_EQUAL(std::make_pair(red, green), attr.CalculateRgbColors(_colorTable, _defaultFgIndex, _defaultBgIndex));
|
||||
VERIFY_ARE_EQUAL(red, attr.GetForeground().GetColor(_colorTable, _defaultFg));
|
||||
VERIFY_ARE_EQUAL(green, attr.GetBackground().GetColor(_colorTable, _defaultBg));
|
||||
VERIFY_ARE_EQUAL(std::make_pair(red, green), attr.CalculateRgbColors(_colorTable, _defaultFg, _defaultBg));
|
||||
|
||||
// with reverse video set, calculated foreground/background values should be
|
||||
// switched while getters stay the same
|
||||
attr.SetReverseVideo(true);
|
||||
|
||||
VERIFY_ARE_EQUAL(red, attr.GetForeground().GetColor(_colorTable, _defaultFgIndex));
|
||||
VERIFY_ARE_EQUAL(green, attr.GetBackground().GetColor(_colorTable, _defaultBgIndex));
|
||||
VERIFY_ARE_EQUAL(std::make_pair(green, red), attr.CalculateRgbColors(_colorTable, _defaultFgIndex, _defaultBgIndex));
|
||||
VERIFY_ARE_EQUAL(red, attr.GetForeground().GetColor(_colorTable, _defaultFg));
|
||||
VERIFY_ARE_EQUAL(green, attr.GetBackground().GetColor(_colorTable, _defaultBg));
|
||||
VERIFY_ARE_EQUAL(std::make_pair(green, red), attr.CalculateRgbColors(_colorTable, _defaultFg, _defaultBg));
|
||||
|
||||
// reset the reverse video
|
||||
attr.SetReverseVideo(false);
|
||||
|
@ -155,17 +151,17 @@ void TextAttributeTests::TestTextAttributeColorGetters()
|
|||
// while the background and getters stay the same
|
||||
attr.SetFaint(true);
|
||||
|
||||
VERIFY_ARE_EQUAL(red, attr.GetForeground().GetColor(_colorTable, _defaultFgIndex));
|
||||
VERIFY_ARE_EQUAL(green, attr.GetBackground().GetColor(_colorTable, _defaultBgIndex));
|
||||
VERIFY_ARE_EQUAL(std::make_pair(faintRed, green), attr.CalculateRgbColors(_colorTable, _defaultFgIndex, _defaultBgIndex));
|
||||
VERIFY_ARE_EQUAL(red, attr.GetForeground().GetColor(_colorTable, _defaultFg));
|
||||
VERIFY_ARE_EQUAL(green, attr.GetBackground().GetColor(_colorTable, _defaultBg));
|
||||
VERIFY_ARE_EQUAL(std::make_pair(faintRed, green), attr.CalculateRgbColors(_colorTable, _defaultFg, _defaultBg));
|
||||
|
||||
// with reverse video set, calculated foreground/background values should be
|
||||
// switched, and the background fainter, while getters stay the same
|
||||
attr.SetReverseVideo(true);
|
||||
|
||||
VERIFY_ARE_EQUAL(red, attr.GetForeground().GetColor(_colorTable, _defaultFgIndex));
|
||||
VERIFY_ARE_EQUAL(green, attr.GetBackground().GetColor(_colorTable, _defaultBgIndex));
|
||||
VERIFY_ARE_EQUAL(std::make_pair(green, faintRed), attr.CalculateRgbColors(_colorTable, _defaultFgIndex, _defaultBgIndex));
|
||||
VERIFY_ARE_EQUAL(red, attr.GetForeground().GetColor(_colorTable, _defaultFg));
|
||||
VERIFY_ARE_EQUAL(green, attr.GetBackground().GetColor(_colorTable, _defaultBg));
|
||||
VERIFY_ARE_EQUAL(std::make_pair(green, faintRed), attr.CalculateRgbColors(_colorTable, _defaultFg, _defaultBg));
|
||||
|
||||
// reset the reverse video and faint attributes
|
||||
attr.SetReverseVideo(false);
|
||||
|
@ -175,17 +171,17 @@ void TextAttributeTests::TestTextAttributeColorGetters()
|
|||
// background, while getters stay the same
|
||||
attr.SetInvisible(true);
|
||||
|
||||
VERIFY_ARE_EQUAL(red, attr.GetForeground().GetColor(_colorTable, _defaultFgIndex));
|
||||
VERIFY_ARE_EQUAL(green, attr.GetBackground().GetColor(_colorTable, _defaultBgIndex));
|
||||
VERIFY_ARE_EQUAL(std::make_pair(green, green), attr.CalculateRgbColors(_colorTable, _defaultFgIndex, _defaultBgIndex));
|
||||
VERIFY_ARE_EQUAL(red, attr.GetForeground().GetColor(_colorTable, _defaultFg));
|
||||
VERIFY_ARE_EQUAL(green, attr.GetBackground().GetColor(_colorTable, _defaultBg));
|
||||
VERIFY_ARE_EQUAL(std::make_pair(green, green), attr.CalculateRgbColors(_colorTable, _defaultFg, _defaultBg));
|
||||
|
||||
// with reverse video set, the calculated background value should match
|
||||
// the foreground, while getters stay the same
|
||||
attr.SetReverseVideo(true);
|
||||
|
||||
VERIFY_ARE_EQUAL(red, attr.GetForeground().GetColor(_colorTable, _defaultFgIndex));
|
||||
VERIFY_ARE_EQUAL(green, attr.GetBackground().GetColor(_colorTable, _defaultBgIndex));
|
||||
VERIFY_ARE_EQUAL(std::make_pair(red, red), attr.CalculateRgbColors(_colorTable, _defaultFgIndex, _defaultBgIndex));
|
||||
VERIFY_ARE_EQUAL(red, attr.GetForeground().GetColor(_colorTable, _defaultFg));
|
||||
VERIFY_ARE_EQUAL(green, attr.GetBackground().GetColor(_colorTable, _defaultBg));
|
||||
VERIFY_ARE_EQUAL(std::make_pair(red, red), attr.CalculateRgbColors(_colorTable, _defaultFg, _defaultBg));
|
||||
}
|
||||
|
||||
void TextAttributeTests::TestReverseDefaultColors()
|
||||
|
@ -198,34 +194,34 @@ void TextAttributeTests::TestReverseDefaultColors()
|
|||
// values when reverse video is not set
|
||||
VERIFY_IS_FALSE(attr.IsReverseVideo());
|
||||
|
||||
VERIFY_ARE_EQUAL(_defaultFg, attr.GetForeground().GetColor(_colorTable, _defaultFgIndex));
|
||||
VERIFY_ARE_EQUAL(_defaultBg, attr.GetBackground().GetColor(_colorTable, _defaultBgIndex));
|
||||
VERIFY_ARE_EQUAL(std::make_pair(_defaultFg, _defaultBg), attr.CalculateRgbColors(_colorTable, _defaultFgIndex, _defaultBgIndex));
|
||||
VERIFY_ARE_EQUAL(_defaultFg, attr.GetForeground().GetColor(_colorTable, _defaultFg));
|
||||
VERIFY_ARE_EQUAL(_defaultBg, attr.GetBackground().GetColor(_colorTable, _defaultBg));
|
||||
VERIFY_ARE_EQUAL(std::make_pair(_defaultFg, _defaultBg), attr.CalculateRgbColors(_colorTable, _defaultFg, _defaultBg));
|
||||
|
||||
// with reverse video set, calculated foreground/background values should be
|
||||
// switched while getters stay the same
|
||||
attr.SetReverseVideo(true);
|
||||
VERIFY_IS_TRUE(attr.IsReverseVideo());
|
||||
|
||||
VERIFY_ARE_EQUAL(_defaultFg, attr.GetForeground().GetColor(_colorTable, _defaultFgIndex));
|
||||
VERIFY_ARE_EQUAL(_defaultBg, attr.GetBackground().GetColor(_colorTable, _defaultBgIndex));
|
||||
VERIFY_ARE_EQUAL(std::make_pair(_defaultBg, _defaultFg), attr.CalculateRgbColors(_colorTable, _defaultFgIndex, _defaultBgIndex));
|
||||
VERIFY_ARE_EQUAL(_defaultFg, attr.GetForeground().GetColor(_colorTable, _defaultFg));
|
||||
VERIFY_ARE_EQUAL(_defaultBg, attr.GetBackground().GetColor(_colorTable, _defaultBg));
|
||||
VERIFY_ARE_EQUAL(std::make_pair(_defaultBg, _defaultFg), attr.CalculateRgbColors(_colorTable, _defaultFg, _defaultBg));
|
||||
|
||||
attr.SetForeground(red);
|
||||
VERIFY_IS_TRUE(attr.IsReverseVideo());
|
||||
|
||||
VERIFY_ARE_EQUAL(red, attr.GetForeground().GetColor(_colorTable, _defaultFgIndex));
|
||||
VERIFY_ARE_EQUAL(_defaultBg, attr.GetBackground().GetColor(_colorTable, _defaultBgIndex));
|
||||
VERIFY_ARE_EQUAL(std::make_pair(_defaultBg, red), attr.CalculateRgbColors(_colorTable, _defaultFgIndex, _defaultBgIndex));
|
||||
VERIFY_ARE_EQUAL(red, attr.GetForeground().GetColor(_colorTable, _defaultFg));
|
||||
VERIFY_ARE_EQUAL(_defaultBg, attr.GetBackground().GetColor(_colorTable, _defaultBg));
|
||||
VERIFY_ARE_EQUAL(std::make_pair(_defaultBg, red), attr.CalculateRgbColors(_colorTable, _defaultFg, _defaultBg));
|
||||
|
||||
attr.Invert();
|
||||
VERIFY_IS_FALSE(attr.IsReverseVideo());
|
||||
attr.SetDefaultForeground();
|
||||
attr.SetBackground(green);
|
||||
|
||||
VERIFY_ARE_EQUAL(_defaultFg, attr.GetForeground().GetColor(_colorTable, _defaultFgIndex));
|
||||
VERIFY_ARE_EQUAL(green, attr.GetBackground().GetColor(_colorTable, _defaultBgIndex));
|
||||
VERIFY_ARE_EQUAL(std::make_pair(_defaultFg, green), attr.CalculateRgbColors(_colorTable, _defaultFgIndex, _defaultBgIndex));
|
||||
VERIFY_ARE_EQUAL(_defaultFg, attr.GetForeground().GetColor(_colorTable, _defaultFg));
|
||||
VERIFY_ARE_EQUAL(green, attr.GetBackground().GetColor(_colorTable, _defaultBg));
|
||||
VERIFY_ARE_EQUAL(std::make_pair(_defaultFg, green), attr.CalculateRgbColors(_colorTable, _defaultFg, _defaultBg));
|
||||
}
|
||||
|
||||
void TextAttributeTests::TestRoundtripDefaultColors()
|
||||
|
@ -281,43 +277,43 @@ void TextAttributeTests::TestBoldAsBright()
|
|||
// values when not bold
|
||||
VERIFY_IS_FALSE(attr.IsBold());
|
||||
|
||||
VERIFY_ARE_EQUAL(_defaultFg, attr.GetForeground().GetColor(_colorTable, _defaultFgIndex));
|
||||
VERIFY_ARE_EQUAL(_defaultBg, attr.GetBackground().GetColor(_colorTable, _defaultBgIndex));
|
||||
VERIFY_ARE_EQUAL(std::make_pair(_defaultFg, _defaultBg), attr.CalculateRgbColors(_colorTable, _defaultFgIndex, _defaultBgIndex, false, false, true));
|
||||
VERIFY_ARE_EQUAL(std::make_pair(_defaultFg, _defaultBg), attr.CalculateRgbColors(_colorTable, _defaultFgIndex, _defaultBgIndex, false, false, false));
|
||||
VERIFY_ARE_EQUAL(_defaultFg, attr.GetForeground().GetColor(_colorTable, _defaultFg));
|
||||
VERIFY_ARE_EQUAL(_defaultBg, attr.GetBackground().GetColor(_colorTable, _defaultBg));
|
||||
VERIFY_ARE_EQUAL(std::make_pair(_defaultFg, _defaultBg), attr.CalculateRgbColors(_colorTable, _defaultFg, _defaultBg, false, false, true));
|
||||
VERIFY_ARE_EQUAL(std::make_pair(_defaultFg, _defaultBg), attr.CalculateRgbColors(_colorTable, _defaultFg, _defaultBg, false, false, false));
|
||||
|
||||
// with bold set, calculated foreground/background values shouldn't change for the default colors.
|
||||
attr.SetBold(true);
|
||||
VERIFY_IS_TRUE(attr.IsBold());
|
||||
VERIFY_ARE_EQUAL(std::make_pair(_defaultFg, _defaultBg), attr.CalculateRgbColors(_colorTable, _defaultFgIndex, _defaultBgIndex, false, false, true));
|
||||
VERIFY_ARE_EQUAL(std::make_pair(_defaultFg, _defaultBg), attr.CalculateRgbColors(_colorTable, _defaultFgIndex, _defaultBgIndex, false, false, false));
|
||||
VERIFY_ARE_EQUAL(std::make_pair(_defaultFg, _defaultBg), attr.CalculateRgbColors(_colorTable, _defaultFg, _defaultBg, false, false, true));
|
||||
VERIFY_ARE_EQUAL(std::make_pair(_defaultFg, _defaultBg), attr.CalculateRgbColors(_colorTable, _defaultFg, _defaultBg, false, false, false));
|
||||
|
||||
attr.SetIndexedForeground(TextColor::DARK_BLACK);
|
||||
VERIFY_IS_TRUE(attr.IsBold());
|
||||
|
||||
Log::Comment(L"Foreground should be bright black when bold is bright is enabled");
|
||||
VERIFY_ARE_EQUAL(std::make_pair(brightBlack, _defaultBg), attr.CalculateRgbColors(_colorTable, _defaultFgIndex, _defaultBgIndex, false, false, true));
|
||||
VERIFY_ARE_EQUAL(std::make_pair(brightBlack, _defaultBg), attr.CalculateRgbColors(_colorTable, _defaultFg, _defaultBg, false, false, true));
|
||||
|
||||
Log::Comment(L"Foreground should be dark black when bold is bright is disabled");
|
||||
VERIFY_ARE_EQUAL(std::make_pair(darkBlack, _defaultBg), attr.CalculateRgbColors(_colorTable, _defaultFgIndex, _defaultBgIndex, false, false, false));
|
||||
VERIFY_ARE_EQUAL(std::make_pair(darkBlack, _defaultBg), attr.CalculateRgbColors(_colorTable, _defaultFg, _defaultBg, false, false, false));
|
||||
|
||||
attr.SetIndexedBackground(TextColor::DARK_GREEN);
|
||||
VERIFY_IS_TRUE(attr.IsBold());
|
||||
|
||||
Log::Comment(L"background should be unaffected by 'bold is bright'");
|
||||
VERIFY_ARE_EQUAL(std::make_pair(brightBlack, darkGreen), attr.CalculateRgbColors(_colorTable, _defaultFgIndex, _defaultBgIndex, false, false, true));
|
||||
VERIFY_ARE_EQUAL(std::make_pair(darkBlack, darkGreen), attr.CalculateRgbColors(_colorTable, _defaultFgIndex, _defaultBgIndex, false, false, false));
|
||||
VERIFY_ARE_EQUAL(std::make_pair(brightBlack, darkGreen), attr.CalculateRgbColors(_colorTable, _defaultFg, _defaultBg, false, false, true));
|
||||
VERIFY_ARE_EQUAL(std::make_pair(darkBlack, darkGreen), attr.CalculateRgbColors(_colorTable, _defaultFg, _defaultBg, false, false, false));
|
||||
|
||||
attr.SetBold(false);
|
||||
VERIFY_IS_FALSE(attr.IsBold());
|
||||
Log::Comment(L"when not bold, 'bold is bright' changes nothing");
|
||||
VERIFY_ARE_EQUAL(std::make_pair(darkBlack, darkGreen), attr.CalculateRgbColors(_colorTable, _defaultFgIndex, _defaultBgIndex, false, false, true));
|
||||
VERIFY_ARE_EQUAL(std::make_pair(darkBlack, darkGreen), attr.CalculateRgbColors(_colorTable, _defaultFgIndex, _defaultBgIndex, false, false, false));
|
||||
VERIFY_ARE_EQUAL(std::make_pair(darkBlack, darkGreen), attr.CalculateRgbColors(_colorTable, _defaultFg, _defaultBg, false, false, true));
|
||||
VERIFY_ARE_EQUAL(std::make_pair(darkBlack, darkGreen), attr.CalculateRgbColors(_colorTable, _defaultFg, _defaultBg, false, false, false));
|
||||
|
||||
Log::Comment(L"When set to a bright color, and bold, 'bold is bright' changes nothing");
|
||||
attr.SetBold(true);
|
||||
attr.SetIndexedForeground(TextColor::BRIGHT_BLACK);
|
||||
VERIFY_IS_TRUE(attr.IsBold());
|
||||
VERIFY_ARE_EQUAL(std::make_pair(brightBlack, darkGreen), attr.CalculateRgbColors(_colorTable, _defaultFgIndex, _defaultBgIndex, false, false, true));
|
||||
VERIFY_ARE_EQUAL(std::make_pair(brightBlack, darkGreen), attr.CalculateRgbColors(_colorTable, _defaultFgIndex, _defaultBgIndex, false, false, false));
|
||||
VERIFY_ARE_EQUAL(std::make_pair(brightBlack, darkGreen), attr.CalculateRgbColors(_colorTable, _defaultFg, _defaultBg, false, false, true));
|
||||
VERIFY_ARE_EQUAL(std::make_pair(brightBlack, darkGreen), attr.CalculateRgbColors(_colorTable, _defaultFg, _defaultBg, false, false, false));
|
||||
}
|
||||
|
|
|
@ -23,11 +23,9 @@ class TextColorTests
|
|||
TEST_METHOD(TestRgbColor);
|
||||
TEST_METHOD(TestChangeColor);
|
||||
|
||||
std::array<COLORREF, TextColor::TABLE_SIZE> _colorTable;
|
||||
const COLORREF _defaultFg = RGB(1, 2, 3);
|
||||
const COLORREF _defaultBg = RGB(4, 5, 6);
|
||||
const size_t _defaultFgIndex = TextColor::DEFAULT_FOREGROUND;
|
||||
const size_t _defaultBgIndex = TextColor::DEFAULT_BACKGROUND;
|
||||
std::array<COLORREF, 256> _colorTable;
|
||||
COLORREF _defaultFg = RGB(1, 2, 3);
|
||||
COLORREF _defaultBg = RGB(4, 5, 6);
|
||||
};
|
||||
|
||||
bool TextColorTests::ClassSetup()
|
||||
|
@ -48,8 +46,6 @@ bool TextColorTests::ClassSetup()
|
|||
_colorTable[13] = RGB(180, 0, 158); // Bright Magenta
|
||||
_colorTable[14] = RGB(249, 241, 165); // Bright Yellow
|
||||
_colorTable[15] = RGB(242, 242, 242); // White
|
||||
_colorTable[_defaultFgIndex] = _defaultFg;
|
||||
_colorTable[_defaultBgIndex] = _defaultBg;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -61,16 +57,16 @@ void TextColorTests::TestDefaultColor()
|
|||
VERIFY_IS_FALSE(defaultColor.IsLegacy());
|
||||
VERIFY_IS_FALSE(defaultColor.IsRgb());
|
||||
|
||||
auto color = defaultColor.GetColor(_colorTable, _defaultFgIndex, false);
|
||||
auto color = defaultColor.GetColor(_colorTable, _defaultFg, false);
|
||||
VERIFY_ARE_EQUAL(_defaultFg, color);
|
||||
|
||||
color = defaultColor.GetColor(_colorTable, _defaultFgIndex, true);
|
||||
color = defaultColor.GetColor(_colorTable, _defaultFg, true);
|
||||
VERIFY_ARE_EQUAL(_defaultFg, color);
|
||||
|
||||
color = defaultColor.GetColor(_colorTable, _defaultBgIndex, false);
|
||||
color = defaultColor.GetColor(_colorTable, _defaultBg, false);
|
||||
VERIFY_ARE_EQUAL(_defaultBg, color);
|
||||
|
||||
color = defaultColor.GetColor(_colorTable, _defaultBgIndex, true);
|
||||
color = defaultColor.GetColor(_colorTable, _defaultBg, true);
|
||||
VERIFY_ARE_EQUAL(_defaultBg, color);
|
||||
}
|
||||
|
||||
|
@ -82,16 +78,16 @@ void TextColorTests::TestDarkIndexColor()
|
|||
VERIFY_IS_TRUE(indexColor.IsLegacy());
|
||||
VERIFY_IS_FALSE(indexColor.IsRgb());
|
||||
|
||||
auto color = indexColor.GetColor(_colorTable, _defaultFgIndex, false);
|
||||
auto color = indexColor.GetColor(_colorTable, _defaultFg, false);
|
||||
VERIFY_ARE_EQUAL(_colorTable[7], color);
|
||||
|
||||
color = indexColor.GetColor(_colorTable, _defaultFgIndex, true);
|
||||
color = indexColor.GetColor(_colorTable, _defaultFg, true);
|
||||
VERIFY_ARE_EQUAL(_colorTable[15], color);
|
||||
|
||||
color = indexColor.GetColor(_colorTable, _defaultBgIndex, false);
|
||||
color = indexColor.GetColor(_colorTable, _defaultBg, false);
|
||||
VERIFY_ARE_EQUAL(_colorTable[7], color);
|
||||
|
||||
color = indexColor.GetColor(_colorTable, _defaultBgIndex, true);
|
||||
color = indexColor.GetColor(_colorTable, _defaultBg, true);
|
||||
VERIFY_ARE_EQUAL(_colorTable[15], color);
|
||||
}
|
||||
|
||||
|
@ -103,16 +99,16 @@ void TextColorTests::TestBrightIndexColor()
|
|||
VERIFY_IS_TRUE(indexColor.IsLegacy());
|
||||
VERIFY_IS_FALSE(indexColor.IsRgb());
|
||||
|
||||
auto color = indexColor.GetColor(_colorTable, _defaultFgIndex, false);
|
||||
auto color = indexColor.GetColor(_colorTable, _defaultFg, false);
|
||||
VERIFY_ARE_EQUAL(_colorTable[15], color);
|
||||
|
||||
color = indexColor.GetColor(_colorTable, _defaultFgIndex, true);
|
||||
color = indexColor.GetColor(_colorTable, _defaultFg, true);
|
||||
VERIFY_ARE_EQUAL(_colorTable[15], color);
|
||||
|
||||
color = indexColor.GetColor(_colorTable, _defaultBgIndex, false);
|
||||
color = indexColor.GetColor(_colorTable, _defaultBg, false);
|
||||
VERIFY_ARE_EQUAL(_colorTable[15], color);
|
||||
|
||||
color = indexColor.GetColor(_colorTable, _defaultBgIndex, true);
|
||||
color = indexColor.GetColor(_colorTable, _defaultBg, true);
|
||||
VERIFY_ARE_EQUAL(_colorTable[15], color);
|
||||
}
|
||||
|
||||
|
@ -125,16 +121,16 @@ void TextColorTests::TestRgbColor()
|
|||
VERIFY_IS_FALSE(rgbColor.IsLegacy());
|
||||
VERIFY_IS_TRUE(rgbColor.IsRgb());
|
||||
|
||||
auto color = rgbColor.GetColor(_colorTable, _defaultFgIndex, false);
|
||||
auto color = rgbColor.GetColor(_colorTable, _defaultFg, false);
|
||||
VERIFY_ARE_EQUAL(myColor, color);
|
||||
|
||||
color = rgbColor.GetColor(_colorTable, _defaultFgIndex, true);
|
||||
color = rgbColor.GetColor(_colorTable, _defaultFg, true);
|
||||
VERIFY_ARE_EQUAL(myColor, color);
|
||||
|
||||
color = rgbColor.GetColor(_colorTable, _defaultBgIndex, false);
|
||||
color = rgbColor.GetColor(_colorTable, _defaultBg, false);
|
||||
VERIFY_ARE_EQUAL(myColor, color);
|
||||
|
||||
color = rgbColor.GetColor(_colorTable, _defaultBgIndex, true);
|
||||
color = rgbColor.GetColor(_colorTable, _defaultBg, true);
|
||||
VERIFY_ARE_EQUAL(myColor, color);
|
||||
}
|
||||
|
||||
|
@ -147,55 +143,55 @@ void TextColorTests::TestChangeColor()
|
|||
VERIFY_IS_FALSE(rgbColor.IsLegacy());
|
||||
VERIFY_IS_TRUE(rgbColor.IsRgb());
|
||||
|
||||
auto color = rgbColor.GetColor(_colorTable, _defaultFgIndex, false);
|
||||
auto color = rgbColor.GetColor(_colorTable, _defaultFg, false);
|
||||
VERIFY_ARE_EQUAL(myColor, color);
|
||||
|
||||
color = rgbColor.GetColor(_colorTable, _defaultFgIndex, true);
|
||||
color = rgbColor.GetColor(_colorTable, _defaultFg, true);
|
||||
VERIFY_ARE_EQUAL(myColor, color);
|
||||
|
||||
color = rgbColor.GetColor(_colorTable, _defaultBgIndex, false);
|
||||
color = rgbColor.GetColor(_colorTable, _defaultBg, false);
|
||||
VERIFY_ARE_EQUAL(myColor, color);
|
||||
|
||||
color = rgbColor.GetColor(_colorTable, _defaultBgIndex, true);
|
||||
color = rgbColor.GetColor(_colorTable, _defaultBg, true);
|
||||
VERIFY_ARE_EQUAL(myColor, color);
|
||||
|
||||
rgbColor.SetDefault();
|
||||
|
||||
color = rgbColor.GetColor(_colorTable, _defaultFgIndex, false);
|
||||
color = rgbColor.GetColor(_colorTable, _defaultFg, false);
|
||||
VERIFY_ARE_EQUAL(_defaultFg, color);
|
||||
|
||||
color = rgbColor.GetColor(_colorTable, _defaultFgIndex, true);
|
||||
color = rgbColor.GetColor(_colorTable, _defaultFg, true);
|
||||
VERIFY_ARE_EQUAL(_defaultFg, color);
|
||||
|
||||
color = rgbColor.GetColor(_colorTable, _defaultBgIndex, false);
|
||||
color = rgbColor.GetColor(_colorTable, _defaultBg, false);
|
||||
VERIFY_ARE_EQUAL(_defaultBg, color);
|
||||
|
||||
color = rgbColor.GetColor(_colorTable, _defaultBgIndex, true);
|
||||
color = rgbColor.GetColor(_colorTable, _defaultBg, true);
|
||||
VERIFY_ARE_EQUAL(_defaultBg, color);
|
||||
|
||||
rgbColor.SetIndex(7, false);
|
||||
color = rgbColor.GetColor(_colorTable, _defaultFgIndex, false);
|
||||
color = rgbColor.GetColor(_colorTable, _defaultFg, false);
|
||||
VERIFY_ARE_EQUAL(_colorTable[7], color);
|
||||
|
||||
color = rgbColor.GetColor(_colorTable, _defaultFgIndex, true);
|
||||
color = rgbColor.GetColor(_colorTable, _defaultFg, true);
|
||||
VERIFY_ARE_EQUAL(_colorTable[15], color);
|
||||
|
||||
color = rgbColor.GetColor(_colorTable, _defaultBgIndex, false);
|
||||
color = rgbColor.GetColor(_colorTable, _defaultBg, false);
|
||||
VERIFY_ARE_EQUAL(_colorTable[7], color);
|
||||
|
||||
color = rgbColor.GetColor(_colorTable, _defaultBgIndex, true);
|
||||
color = rgbColor.GetColor(_colorTable, _defaultBg, true);
|
||||
VERIFY_ARE_EQUAL(_colorTable[15], color);
|
||||
|
||||
rgbColor.SetIndex(15, false);
|
||||
color = rgbColor.GetColor(_colorTable, _defaultFgIndex, false);
|
||||
color = rgbColor.GetColor(_colorTable, _defaultFg, false);
|
||||
VERIFY_ARE_EQUAL(_colorTable[15], color);
|
||||
|
||||
color = rgbColor.GetColor(_colorTable, _defaultFgIndex, true);
|
||||
color = rgbColor.GetColor(_colorTable, _defaultFg, true);
|
||||
VERIFY_ARE_EQUAL(_colorTable[15], color);
|
||||
|
||||
color = rgbColor.GetColor(_colorTable, _defaultBgIndex, false);
|
||||
color = rgbColor.GetColor(_colorTable, _defaultBg, false);
|
||||
VERIFY_ARE_EQUAL(_colorTable[15], color);
|
||||
|
||||
color = rgbColor.GetColor(_colorTable, _defaultBgIndex, true);
|
||||
color = rgbColor.GetColor(_colorTable, _defaultBg, true);
|
||||
VERIFY_ARE_EQUAL(_colorTable[15], color);
|
||||
}
|
||||
|
|
|
@ -61,26 +61,13 @@
|
|||
|
||||
<Import Project="$(MSBuildThisFileDirectory)..\CascadiaResources.build.items" />
|
||||
<Import Project="$(OpenConsoleDir)src\wap-common.build.post.props" />
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="$(OpenConsoleDir)src\cascadia\WindowsTerminal\WindowsTerminal.vcxproj">
|
||||
<Project>{CA5CAD1A-1754-4A9D-93D7-857A9D17CB1B}</Project>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="$(OpenConsoleDir)src\cascadia\TerminalAzBridge\TerminalAzBridge.vcxproj">
|
||||
<Project>{067F0A06-FCB7-472C-96E9-B03B54E8E18D}</Project>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="$(OpenConsoleDir)src\cascadia\ShellExtension\WindowsTerminalShellExt.vcxproj">
|
||||
<Project>{f2ed628a-db22-446f-a081-4cc845b51a2b}</Project>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="$(OpenConsoleDir)src\cascadia\wt\wt.vcxproj">
|
||||
<Project>{506fd703-baa7-4f6e-9361-64f550ec8fca}</Project>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="$(OpenConsoleDir)src\host\exe\Host.EXE.vcxproj">
|
||||
<Project>{9CBD7DFA-1754-4A9D-93D7-857A9D17CB1B}</Project>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="$(OpenConsoleDir)src\host\proxy\Host.Proxy.vcxproj">
|
||||
<Project>{71CC9D78-BA29-4D93-946F-BEF5D9A3A6EF}</Project>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\WindowsTerminal\WindowsTerminal.vcxproj" />
|
||||
<ProjectReference Include="..\..\host\exe\Host.EXE.vcxproj" />
|
||||
<ProjectReference Include="..\..\host\proxy\Host.Proxy.vcxproj" />
|
||||
<ProjectReference Include="..\TerminalAzBridge\TerminalAzBridge.vcxproj" />
|
||||
<ProjectReference Include="..\ShellExtension\WindowsTerminalShellExt.vcxproj" />
|
||||
<ProjectReference Include="..\wt\wt.vcxproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<Target Name="OpenConsoleStompSourceProjectForWapProject" BeforeTargets="_ConvertItems">
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
</Properties>
|
||||
|
||||
<Dependencies>
|
||||
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.18362.0" MaxVersionTested="10.0.22000.0" />
|
||||
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.18362.0" MaxVersionTested="10.0.19041.0" />
|
||||
</Dependencies>
|
||||
|
||||
<Resources>
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
</Properties>
|
||||
|
||||
<Dependencies>
|
||||
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.18362.0" MaxVersionTested="10.0.22000.0" />
|
||||
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.18362.0" MaxVersionTested="10.0.19041.0" />
|
||||
</Dependencies>
|
||||
|
||||
<Resources>
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
</Properties>
|
||||
|
||||
<Dependencies>
|
||||
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.18362.0" MaxVersionTested="10.0.22000.0" />
|
||||
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.18362.0" MaxVersionTested="10.0.19041.0" />
|
||||
</Dependencies>
|
||||
|
||||
<Resources>
|
||||
|
|
|
@ -55,8 +55,12 @@ namespace SettingsModelLocalTests
|
|||
TerminalSettings settings;
|
||||
VERIFY_IS_NOT_NULL(settings);
|
||||
auto oldFontSize = settings.FontSize();
|
||||
settings.FontSize(oldFontSize + 5);
|
||||
auto newFontSize = settings.FontSize();
|
||||
|
||||
auto selfSettings = winrt::make_self<implementation::TerminalSettings>();
|
||||
VERIFY_ARE_EQUAL(oldFontSize, selfSettings->FontSize());
|
||||
|
||||
selfSettings->FontSize(oldFontSize + 5);
|
||||
auto newFontSize = selfSettings->FontSize();
|
||||
VERIFY_ARE_NOT_EQUAL(oldFontSize, newFontSize);
|
||||
}
|
||||
|
||||
|
|
|
@ -90,7 +90,6 @@ namespace TerminalAppLocalTests
|
|||
TEST_METHOD(TestWindowRenameSuccessful);
|
||||
TEST_METHOD(TestWindowRenameFailure);
|
||||
|
||||
TEST_METHOD(TestControlSettingsHasParent);
|
||||
TEST_METHOD(TestPreviewCommitScheme);
|
||||
TEST_METHOD(TestPreviewDismissScheme);
|
||||
TEST_METHOD(TestPreviewSchemeWhilePreviewing);
|
||||
|
@ -134,10 +133,6 @@ namespace TerminalAppLocalTests
|
|||
// Just creating it is enough to know that everything is working.
|
||||
TerminalSettings settings;
|
||||
VERIFY_IS_NOT_NULL(settings);
|
||||
auto oldFontSize = settings.FontSize();
|
||||
settings.FontSize(oldFontSize + 5);
|
||||
auto newFontSize = settings.FontSize();
|
||||
VERIFY_ARE_NOT_EQUAL(oldFontSize, newFontSize);
|
||||
}
|
||||
|
||||
void TabTests::TryCreateConnectionType()
|
||||
|
@ -1297,25 +1292,6 @@ namespace TerminalAppLocalTests
|
|||
});
|
||||
}
|
||||
|
||||
void TabTests::TestControlSettingsHasParent()
|
||||
{
|
||||
Log::Comment(L"Ensure that when we create a control, it always has a parent TerminalSettings");
|
||||
|
||||
auto page = _commonSetup();
|
||||
VERIFY_IS_NOT_NULL(page);
|
||||
|
||||
TestOnUIThread([&page]() {
|
||||
const auto& activeControl{ page->_GetActiveControl() };
|
||||
VERIFY_IS_NOT_NULL(activeControl);
|
||||
|
||||
const auto& controlSettings = activeControl.Settings().as<TerminalSettings>();
|
||||
VERIFY_IS_NOT_NULL(controlSettings);
|
||||
|
||||
const auto& originalSettings = controlSettings.GetParent();
|
||||
VERIFY_IS_NOT_NULL(originalSettings);
|
||||
});
|
||||
}
|
||||
|
||||
void TabTests::TestPreviewCommitScheme()
|
||||
{
|
||||
Log::Comment(L"Preview a color scheme. Make sure it's applied, then committed accordingly");
|
||||
|
@ -1327,12 +1303,9 @@ namespace TerminalAppLocalTests
|
|||
const auto& activeControl{ page->_GetActiveControl() };
|
||||
VERIFY_IS_NOT_NULL(activeControl);
|
||||
|
||||
const auto& controlSettings = activeControl.Settings().as<TerminalSettings>();
|
||||
const auto& controlSettings = activeControl.Settings();
|
||||
VERIFY_IS_NOT_NULL(controlSettings);
|
||||
|
||||
const auto& originalSettings = controlSettings.GetParent();
|
||||
VERIFY_IS_NOT_NULL(originalSettings);
|
||||
|
||||
VERIFY_ARE_EQUAL(til::color{ 0xff0c0c0c }, controlSettings.DefaultBackground());
|
||||
});
|
||||
|
||||
|
@ -1346,17 +1319,12 @@ namespace TerminalAppLocalTests
|
|||
const auto& activeControl{ page->_GetActiveControl() };
|
||||
VERIFY_IS_NOT_NULL(activeControl);
|
||||
|
||||
const auto& controlSettings = activeControl.Settings().as<TerminalSettings>();
|
||||
const auto& controlSettings = activeControl.Settings();
|
||||
VERIFY_IS_NOT_NULL(controlSettings);
|
||||
|
||||
const auto& previewSettings = controlSettings.GetParent();
|
||||
VERIFY_IS_NOT_NULL(previewSettings);
|
||||
|
||||
const auto& originalSettings = previewSettings.GetParent();
|
||||
VERIFY_IS_NOT_NULL(originalSettings);
|
||||
|
||||
Log::Comment(L"Color should be changed to the preview");
|
||||
VERIFY_ARE_EQUAL(til::color{ 0xff000000 }, controlSettings.DefaultBackground());
|
||||
|
||||
// And we should have stored a function to revert the change.
|
||||
VERIFY_ARE_EQUAL(1u, page->_restorePreviewFuncs.size());
|
||||
});
|
||||
|
@ -1373,20 +1341,22 @@ namespace TerminalAppLocalTests
|
|||
const auto& activeControl{ page->_GetActiveControl() };
|
||||
VERIFY_IS_NOT_NULL(activeControl);
|
||||
|
||||
const auto& controlSettings = activeControl.Settings().as<TerminalSettings>();
|
||||
const auto& controlSettings = activeControl.Settings();
|
||||
VERIFY_IS_NOT_NULL(controlSettings);
|
||||
|
||||
const auto& originalSettings = controlSettings.GetParent();
|
||||
VERIFY_IS_NOT_NULL(originalSettings);
|
||||
|
||||
const auto& grandparentSettings = originalSettings.GetParent();
|
||||
VERIFY_IS_NULL(grandparentSettings);
|
||||
|
||||
Log::Comment(L"Color should be changed");
|
||||
VERIFY_ARE_EQUAL(til::color{ 0xff000000 }, controlSettings.DefaultBackground());
|
||||
|
||||
// After preview there should be no more restore functions to execute.
|
||||
VERIFY_ARE_EQUAL(0u, page->_restorePreviewFuncs.size());
|
||||
});
|
||||
|
||||
Log::Comment(L"Sleep to let events propagate");
|
||||
// If you don't do this, we will _sometimes_ crash as we're tearing down
|
||||
// the control from this test as we start the next one. We crash
|
||||
// somewhere in the CursorPositionChanged handler. It's annoying, but
|
||||
// this works.
|
||||
Sleep(250);
|
||||
}
|
||||
|
||||
void TabTests::TestPreviewDismissScheme()
|
||||
|
@ -1400,12 +1370,9 @@ namespace TerminalAppLocalTests
|
|||
const auto& activeControl{ page->_GetActiveControl() };
|
||||
VERIFY_IS_NOT_NULL(activeControl);
|
||||
|
||||
const auto& controlSettings = activeControl.Settings().as<TerminalSettings>();
|
||||
const auto& controlSettings = activeControl.Settings();
|
||||
VERIFY_IS_NOT_NULL(controlSettings);
|
||||
|
||||
const auto& originalSettings = controlSettings.GetParent();
|
||||
VERIFY_IS_NOT_NULL(originalSettings);
|
||||
|
||||
VERIFY_ARE_EQUAL(til::color{ 0xff0c0c0c }, controlSettings.DefaultBackground());
|
||||
});
|
||||
|
||||
|
@ -1419,15 +1386,9 @@ namespace TerminalAppLocalTests
|
|||
const auto& activeControl{ page->_GetActiveControl() };
|
||||
VERIFY_IS_NOT_NULL(activeControl);
|
||||
|
||||
const auto& controlSettings = activeControl.Settings().as<TerminalSettings>();
|
||||
const auto& controlSettings = activeControl.Settings();
|
||||
VERIFY_IS_NOT_NULL(controlSettings);
|
||||
|
||||
const auto& previewSettings = controlSettings.GetParent();
|
||||
VERIFY_IS_NOT_NULL(previewSettings);
|
||||
|
||||
const auto& originalSettings = previewSettings.GetParent();
|
||||
VERIFY_IS_NOT_NULL(originalSettings);
|
||||
|
||||
Log::Comment(L"Color should be changed to the preview");
|
||||
VERIFY_ARE_EQUAL(til::color{ 0xff000000 }, controlSettings.DefaultBackground());
|
||||
});
|
||||
|
@ -1441,18 +1402,14 @@ namespace TerminalAppLocalTests
|
|||
const auto& activeControl{ page->_GetActiveControl() };
|
||||
VERIFY_IS_NOT_NULL(activeControl);
|
||||
|
||||
const auto& controlSettings = activeControl.Settings().as<TerminalSettings>();
|
||||
const auto& controlSettings = activeControl.Settings();
|
||||
VERIFY_IS_NOT_NULL(controlSettings);
|
||||
|
||||
const auto& originalSettings = controlSettings.GetParent();
|
||||
VERIFY_IS_NOT_NULL(originalSettings);
|
||||
|
||||
const auto& grandparentSettings = originalSettings.GetParent();
|
||||
VERIFY_IS_NULL(grandparentSettings);
|
||||
|
||||
Log::Comment(L"Color should be the same as it originally was");
|
||||
VERIFY_ARE_EQUAL(til::color{ 0xff0c0c0c }, controlSettings.DefaultBackground());
|
||||
});
|
||||
Log::Comment(L"Sleep to let events propagate");
|
||||
Sleep(250);
|
||||
}
|
||||
|
||||
void TabTests::TestPreviewSchemeWhilePreviewing()
|
||||
|
@ -1468,12 +1425,9 @@ namespace TerminalAppLocalTests
|
|||
const auto& activeControl{ page->_GetActiveControl() };
|
||||
VERIFY_IS_NOT_NULL(activeControl);
|
||||
|
||||
const auto& controlSettings = activeControl.Settings().as<TerminalSettings>();
|
||||
const auto& controlSettings = activeControl.Settings();
|
||||
VERIFY_IS_NOT_NULL(controlSettings);
|
||||
|
||||
const auto& originalSettings = controlSettings.GetParent();
|
||||
VERIFY_IS_NOT_NULL(originalSettings);
|
||||
|
||||
VERIFY_ARE_EQUAL(til::color{ 0xff0c0c0c }, controlSettings.DefaultBackground());
|
||||
});
|
||||
|
||||
|
@ -1487,15 +1441,9 @@ namespace TerminalAppLocalTests
|
|||
const auto& activeControl{ page->_GetActiveControl() };
|
||||
VERIFY_IS_NOT_NULL(activeControl);
|
||||
|
||||
const auto& controlSettings = activeControl.Settings().as<TerminalSettings>();
|
||||
const auto& controlSettings = activeControl.Settings();
|
||||
VERIFY_IS_NOT_NULL(controlSettings);
|
||||
|
||||
const auto& previewSettings = controlSettings.GetParent();
|
||||
VERIFY_IS_NOT_NULL(previewSettings);
|
||||
|
||||
const auto& originalSettings = previewSettings.GetParent();
|
||||
VERIFY_IS_NOT_NULL(originalSettings);
|
||||
|
||||
Log::Comment(L"Color should be changed to the preview");
|
||||
VERIFY_ARE_EQUAL(til::color{ 0xff000000 }, controlSettings.DefaultBackground());
|
||||
});
|
||||
|
@ -1510,15 +1458,9 @@ namespace TerminalAppLocalTests
|
|||
const auto& activeControl{ page->_GetActiveControl() };
|
||||
VERIFY_IS_NOT_NULL(activeControl);
|
||||
|
||||
const auto& controlSettings = activeControl.Settings().as<TerminalSettings>();
|
||||
const auto& controlSettings = activeControl.Settings();
|
||||
VERIFY_IS_NOT_NULL(controlSettings);
|
||||
|
||||
const auto& previewSettings = controlSettings.GetParent();
|
||||
VERIFY_IS_NOT_NULL(previewSettings);
|
||||
|
||||
const auto& originalSettings = previewSettings.GetParent();
|
||||
VERIFY_IS_NOT_NULL(originalSettings);
|
||||
|
||||
Log::Comment(L"Color should be changed to the preview");
|
||||
VERIFY_ARE_EQUAL(til::color{ 0xffFAFAFA }, controlSettings.DefaultBackground());
|
||||
});
|
||||
|
@ -1535,18 +1477,14 @@ namespace TerminalAppLocalTests
|
|||
const auto& activeControl{ page->_GetActiveControl() };
|
||||
VERIFY_IS_NOT_NULL(activeControl);
|
||||
|
||||
const auto& controlSettings = activeControl.Settings().as<TerminalSettings>();
|
||||
const auto& controlSettings = activeControl.Settings();
|
||||
VERIFY_IS_NOT_NULL(controlSettings);
|
||||
|
||||
const auto& originalSettings = controlSettings.GetParent();
|
||||
VERIFY_IS_NOT_NULL(originalSettings);
|
||||
|
||||
const auto& grandparentSettings = originalSettings.GetParent();
|
||||
VERIFY_IS_NULL(grandparentSettings);
|
||||
|
||||
Log::Comment(L"Color should be changed");
|
||||
VERIFY_ARE_EQUAL(til::color{ 0xffFAFAFA }, controlSettings.DefaultBackground());
|
||||
});
|
||||
Log::Comment(L"Sleep to let events propagate");
|
||||
Sleep(250);
|
||||
}
|
||||
|
||||
void TabTests::TestClampSwitchToTab()
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
</Properties>
|
||||
|
||||
<Dependencies>
|
||||
<TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.17763.0" MaxVersionTested="10.0.22000.0" />
|
||||
<TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.17763.0" MaxVersionTested="10.0.19041.0" />
|
||||
<PackageDependency Name="Microsoft.VCLibs.140.00.Debug" MinVersion="14.0.27023.1" Publisher="CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US" />
|
||||
<PackageDependency Name="Microsoft.VCLibs.140.00.Debug.UWPDesktop" MinVersion="14.0.27027.1" Publisher="CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US" />
|
||||
</Dependencies>
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
<uap:SupportedUsers>multiple</uap:SupportedUsers>
|
||||
</Properties>
|
||||
<Dependencies>
|
||||
<TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.17763.0" MaxVersionTested="10.0.22000.0" />
|
||||
<TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.17763.0" MaxVersionTested="10.0.19041.0" />
|
||||
</Dependencies>
|
||||
<Resources>
|
||||
<Resource Language="x-generate" />
|
||||
|
|
|
@ -239,8 +239,8 @@ HRESULT HwndTerminal::Initialize()
|
|||
_terminal->SetBackgroundCallback([](auto) {});
|
||||
|
||||
_terminal->Create(COORD{ 80, 25 }, 1000, *_renderer);
|
||||
_terminal->SetColorTableEntry(TextColor::DEFAULT_BACKGROUND, RGB(12, 12, 12));
|
||||
_terminal->SetColorTableEntry(TextColor::DEFAULT_FOREGROUND, RGB(204, 204, 204));
|
||||
_terminal->SetDefaultBackground(RGB(12, 12, 12));
|
||||
_terminal->SetDefaultForeground(RGB(204, 204, 204));
|
||||
_terminal->SetWriteInputCallback([=](std::wstring& input) noexcept { _WriteTextToConnection(input); });
|
||||
localPointerToThread->EnablePainting();
|
||||
|
||||
|
@ -781,8 +781,8 @@ void _stdcall TerminalSetTheme(void* terminal, TerminalTheme theme, LPCWSTR font
|
|||
{
|
||||
auto lock = publicTerminal->_terminal->LockForWriting();
|
||||
|
||||
publicTerminal->_terminal->SetColorTableEntry(TextColor::DEFAULT_FOREGROUND, theme.DefaultForeground);
|
||||
publicTerminal->_terminal->SetColorTableEntry(TextColor::DEFAULT_BACKGROUND, theme.DefaultBackground);
|
||||
publicTerminal->_terminal->SetDefaultForeground(theme.DefaultForeground);
|
||||
publicTerminal->_terminal->SetDefaultBackground(theme.DefaultBackground);
|
||||
publicTerminal->_renderEngine->SetSelectionBackground(theme.DefaultSelectionBackground, theme.SelectionBackgroundAlpha);
|
||||
|
||||
// Set the font colors
|
||||
|
|
|
@ -67,8 +67,12 @@ namespace winrt::TerminalApp::implementation
|
|||
// - <none>
|
||||
void TerminalPage::_EndPreviewColorScheme()
|
||||
{
|
||||
for (const auto& f : _restorePreviewFuncs)
|
||||
// Apply the reverts in reverse order - If we had multiple previews
|
||||
// stacked on top of each other, then this will ensure the first one in
|
||||
// is the last one out.
|
||||
for (auto i{ _restorePreviewFuncs.rbegin() }; i < _restorePreviewFuncs.rend(); i++)
|
||||
{
|
||||
auto f = *i;
|
||||
f();
|
||||
}
|
||||
_restorePreviewFuncs.clear();
|
||||
|
@ -90,59 +94,18 @@ namespace winrt::TerminalApp::implementation
|
|||
{
|
||||
if (const auto& scheme{ _settings.GlobalSettings().ColorSchemes().TryLookup(args.SchemeName()) })
|
||||
{
|
||||
// Clear the saved preview funcs because we don't need to add a restore each time
|
||||
// the preview color changes, we only need to be able to restore the last one.
|
||||
_restorePreviewFuncs.clear();
|
||||
|
||||
_ApplyToActiveControls([&](const auto& control) {
|
||||
// Get the settings of the focused control and stash them
|
||||
const auto& controlSettings = control.Settings().as<TerminalSettings>();
|
||||
// Make sure to recurse up to the root - if you're doing
|
||||
// this while you're currently previewing a SetColorScheme
|
||||
// action, then the parent of the control's settings is _the
|
||||
// last preview TerminalSettings we inserted! We don't want
|
||||
// to save that one!
|
||||
auto originalSettings = controlSettings.GetParent();
|
||||
while (originalSettings.GetParent() != nullptr)
|
||||
{
|
||||
originalSettings = originalSettings.GetParent();
|
||||
}
|
||||
// Create a new child for those settings
|
||||
TerminalSettingsCreateResult fake{ originalSettings };
|
||||
const auto& childStruct = TerminalSettings::CreateWithParent(fake);
|
||||
// Modify the child to have the applied color scheme
|
||||
childStruct.DefaultSettings().ApplyColorScheme(scheme);
|
||||
// Stash a copy of the current scheme.
|
||||
auto originalScheme{ control.ColorScheme() };
|
||||
|
||||
// Insert that new child as the parent of the control's settings
|
||||
controlSettings.SetParent(childStruct.DefaultSettings());
|
||||
control.UpdateSettings();
|
||||
// Apply the new scheme.
|
||||
control.ColorScheme(scheme.ToCoreScheme());
|
||||
|
||||
// Take a copy of the inputs, since they are pointers anyways.
|
||||
// Each control will emplace a revert into the
|
||||
// _restorePreviewFuncs for itself.
|
||||
_restorePreviewFuncs.emplace_back([=]() {
|
||||
// Get the runtime settings of the focused control
|
||||
const auto& controlSettings{ control.Settings().as<TerminalSettings>() };
|
||||
|
||||
// Get the control's root settings, the ones that we actually
|
||||
// assigned to it.
|
||||
auto parentSettings{ controlSettings.GetParent() };
|
||||
while (parentSettings.GetParent() != nullptr)
|
||||
{
|
||||
parentSettings = parentSettings.GetParent();
|
||||
}
|
||||
|
||||
// If the root settings are the same as the ones we stashed,
|
||||
// then reset the parent of the runtime settings to the stashed
|
||||
// settings. This condition might be false if the settings
|
||||
// hot-reloaded while the palette was open. In that case, we
|
||||
// don't want to reset the settings to what they were _before_
|
||||
// the hot-reload.
|
||||
if (originalSettings == parentSettings)
|
||||
{
|
||||
// Set the original settings as the parent of the control's settings
|
||||
control.Settings().as<TerminalSettings>().SetParent(originalSettings);
|
||||
}
|
||||
|
||||
control.UpdateSettings();
|
||||
// On dismiss, restore the original scheme.
|
||||
control.ColorScheme(originalScheme);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
|
|
@ -451,28 +451,7 @@ namespace winrt::TerminalApp::implementation
|
|||
if (const auto scheme = _settings.GlobalSettings().ColorSchemes().TryLookup(realArgs.SchemeName()))
|
||||
{
|
||||
const auto res = _ApplyToActiveControls([&](auto& control) {
|
||||
// Start by getting the current settings of the control
|
||||
auto controlSettings = control.Settings().as<TerminalSettings>();
|
||||
auto parentSettings = controlSettings;
|
||||
// Those are the _runtime_ settings however. What we
|
||||
// need to do is:
|
||||
//
|
||||
// 1. Blow away any colors set in the runtime settings.
|
||||
// 2. Apply the color scheme to the parent settings.
|
||||
//
|
||||
// 1 is important to make sure that the effects of
|
||||
// something like `colortool` are cleared when setting
|
||||
// the scheme.
|
||||
if (controlSettings.GetParent() != nullptr)
|
||||
{
|
||||
parentSettings = controlSettings.GetParent();
|
||||
}
|
||||
|
||||
// ApplyColorScheme(nullptr) will clear the old color scheme.
|
||||
controlSettings.ApplyColorScheme(nullptr);
|
||||
parentSettings.ApplyColorScheme(scheme);
|
||||
|
||||
control.UpdateSettings();
|
||||
control.ColorScheme(scheme.ToCoreScheme());
|
||||
});
|
||||
args.Handled(res);
|
||||
}
|
||||
|
|
|
@ -125,7 +125,7 @@ NewTerminalArgs Pane::GetTerminalArgsForPane() const
|
|||
assert(_IsLeaf());
|
||||
|
||||
NewTerminalArgs args{};
|
||||
auto controlSettings = _control.Settings().as<TerminalSettings>();
|
||||
auto controlSettings = _control.Settings();
|
||||
|
||||
args.Profile(controlSettings.ProfileName());
|
||||
// If we know the user's working directory use it instead of the profile.
|
||||
|
@ -156,16 +156,13 @@ NewTerminalArgs Pane::GetTerminalArgsForPane() const
|
|||
args.TabColor(winrt::Windows::Foundation::IReference<winrt::Windows::UI::Color>(c));
|
||||
}
|
||||
|
||||
if (controlSettings.AppliedColorScheme())
|
||||
{
|
||||
auto name = controlSettings.AppliedColorScheme().Name();
|
||||
// Only save the color scheme if it is different than the profile color
|
||||
// scheme to not override any other profile appearance choices.
|
||||
if (_profile.DefaultAppearance().ColorSchemeName() != name)
|
||||
{
|
||||
args.ColorScheme(name);
|
||||
}
|
||||
}
|
||||
// TODO:GH#9800 - we used to be able to persist the color scheme that a
|
||||
// TermControl was initialized with, by name. With the change to having the
|
||||
// control own its own copy of its settings, this isn't possible anymore.
|
||||
//
|
||||
// We may be able to get around this by storing the Name in the Core::Scheme
|
||||
// object. That would work for schemes set by the Terminal, but not ones set
|
||||
// by VT, but that seems good enough.
|
||||
|
||||
return args;
|
||||
}
|
||||
|
@ -1459,21 +1456,8 @@ void Pane::UpdateSettings(const TerminalSettingsCreateResult& settings, const Pr
|
|||
assert(_IsLeaf());
|
||||
|
||||
_profile = profile;
|
||||
auto controlSettings = _control.Settings().as<TerminalSettings>();
|
||||
// Update the parent of the control's settings object (and not the object itself) so
|
||||
// that any overrides made by the control don't get affected by the reload
|
||||
controlSettings.SetParent(settings.DefaultSettings());
|
||||
auto unfocusedSettings{ settings.UnfocusedSettings() };
|
||||
if (unfocusedSettings)
|
||||
{
|
||||
// Note: the unfocused settings needs to be entirely unchanged _except_ we need to
|
||||
// set its parent to the settings object that lives in the control. This is because
|
||||
// the overrides made by the control live in that settings object, so we want to make
|
||||
// sure the unfocused settings inherit from that.
|
||||
unfocusedSettings.SetParent(controlSettings);
|
||||
}
|
||||
_control.UnfocusedAppearance(unfocusedSettings);
|
||||
_control.UpdateSettings();
|
||||
|
||||
_control.UpdateControlSettings(settings.DefaultSettings(), settings.UnfocusedSettings());
|
||||
}
|
||||
|
||||
// Method Description:
|
||||
|
|
|
@ -318,29 +318,7 @@
|
|||
</ProjectReference>
|
||||
<!-- For whatever reason, we can't include the TerminalControl and
|
||||
TerminalSettings projects' winmds via project references. So we'll have to
|
||||
manually include the winmds as References below
|
||||
|
||||
BODGY: we do need to add a ProjectReference to TerminalControl.vcxproj,
|
||||
with Private=true, ReferenceOutputAssembly=false, so that Visual Studio's
|
||||
"Fast Up-to-date Check" will work with this project. If we don't, the Fast
|
||||
Up-to-date Check will look for the .xaml files from that project in our
|
||||
output, which won't actually be there.
|
||||
|
||||
We do still need to separately reference the winmds manually below, which is annoying.
|
||||
-->
|
||||
<ProjectReference Include="$(OpenConsoleDir)src\cascadia\TerminalControl\dll\TerminalControl.vcxproj">
|
||||
<!-- Private:true and ReferenceOutputAssembly:false, in combination with
|
||||
the manual reference to TerminalControl.winmd below make sure that this
|
||||
project will compile correct, and that we won't roll up the TermControl
|
||||
xbf's into the packaging project twice. -->
|
||||
<Private>true</Private>
|
||||
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="$(OpenConsoleDir)src\cascadia\TerminalSettingsEditor\Microsoft.Terminal.Settings.Editor.vcxproj">
|
||||
<Private>true</Private>
|
||||
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
|
||||
</ProjectReference>
|
||||
|
||||
manually include the winmds as References below -->
|
||||
</ItemGroup>
|
||||
<PropertyGroup>
|
||||
<!-- This is a hack to get the ARM64 CI build working. See
|
||||
|
|
|
@ -3,38 +3,38 @@
|
|||
|
||||
#include "pch.h"
|
||||
#include "TerminalPage.h"
|
||||
#include "TerminalPage.g.cpp"
|
||||
#include "RenameWindowRequestedArgs.g.cpp"
|
||||
#include "Utils.h"
|
||||
#include "../../types/inc/utils.hpp"
|
||||
|
||||
#include <filesystem>
|
||||
|
||||
#include <inc/WindowingBehavior.h>
|
||||
#include <LibraryResources.h>
|
||||
#include <TerminalCore/ControlKeyStates.hpp>
|
||||
#include <til/latch.h>
|
||||
|
||||
#include "../../types/inc/utils.hpp"
|
||||
#include "TerminalPage.g.cpp"
|
||||
#include <winrt/Windows.Storage.h>
|
||||
|
||||
#include "TabRowControl.h"
|
||||
#include "ColorHelper.h"
|
||||
#include "DebugTapConnection.h"
|
||||
#include "SettingsTab.h"
|
||||
#include "TabRowControl.h"
|
||||
#include "RenameWindowRequestedArgs.g.cpp"
|
||||
#include "../inc/WindowingBehavior.h"
|
||||
|
||||
#include <til/latch.h>
|
||||
|
||||
using namespace winrt;
|
||||
using namespace winrt::Microsoft::Terminal::Control;
|
||||
using namespace winrt::Microsoft::Terminal::Settings::Model;
|
||||
using namespace winrt::Microsoft::Terminal::TerminalConnection;
|
||||
using namespace winrt::Microsoft::Terminal;
|
||||
using namespace winrt::Windows::ApplicationModel::DataTransfer;
|
||||
using namespace winrt::Windows::Foundation::Collections;
|
||||
using namespace winrt::Windows::System;
|
||||
using namespace winrt::Windows::System;
|
||||
using namespace winrt::Windows::UI::Core;
|
||||
using namespace winrt::Windows::UI::Text;
|
||||
using namespace winrt::Windows::UI::Xaml::Controls;
|
||||
using namespace winrt::Windows::UI::Xaml;
|
||||
using namespace winrt::Windows::UI::Xaml::Controls;
|
||||
using namespace winrt::Windows::UI::Core;
|
||||
using namespace winrt::Windows::System;
|
||||
using namespace winrt::Windows::ApplicationModel::DataTransfer;
|
||||
using namespace winrt::Windows::UI::Text;
|
||||
using namespace winrt::Microsoft::Terminal;
|
||||
using namespace winrt::Microsoft::Terminal::Control;
|
||||
using namespace winrt::Microsoft::Terminal::TerminalConnection;
|
||||
using namespace winrt::Microsoft::Terminal::Settings::Model;
|
||||
using namespace ::TerminalApp;
|
||||
using namespace ::Microsoft::Console;
|
||||
using namespace ::Microsoft::Terminal::Core;
|
||||
using namespace std::chrono_literals;
|
||||
|
||||
#define HOOKUP_ACTION(action) _actionDispatch->action({ this, &TerminalPage::_Handle##action });
|
||||
|
@ -1038,153 +1038,29 @@ namespace winrt::TerminalApp::implementation
|
|||
}
|
||||
|
||||
// Method Description:
|
||||
// - Called when the users pressed keyBindings while CommandPalette is open.
|
||||
// - This method is effectively an extract of TermControl::_KeyHandler and TermControl::_TryHandleKeyBinding.
|
||||
// Called when the users pressed keyBindings while CommandPalette is open.
|
||||
// Arguments:
|
||||
// - e: the KeyRoutedEventArgs containing info about the keystroke.
|
||||
// Return Value:
|
||||
// - <none>
|
||||
void TerminalPage::_KeyDownHandler(Windows::Foundation::IInspectable const& /*sender*/, Windows::UI::Xaml::Input::KeyRoutedEventArgs const& e)
|
||||
{
|
||||
const auto keyStatus = e.KeyStatus();
|
||||
const auto vkey = gsl::narrow_cast<WORD>(e.OriginalKey());
|
||||
const auto scanCode = gsl::narrow_cast<WORD>(keyStatus.ScanCode);
|
||||
const auto modifiers = _GetPressedModifierKeys();
|
||||
const auto key = e.OriginalKey();
|
||||
const auto scanCode = e.KeyStatus().ScanCode;
|
||||
const auto coreWindow = CoreWindow::GetForCurrentThread();
|
||||
const auto ctrlDown = WI_IsFlagSet(coreWindow.GetKeyState(winrt::Windows::System::VirtualKey::Control), CoreVirtualKeyStates::Down);
|
||||
const auto altDown = WI_IsFlagSet(coreWindow.GetKeyState(winrt::Windows::System::VirtualKey::Menu), CoreVirtualKeyStates::Down);
|
||||
const auto shiftDown = WI_IsFlagSet(coreWindow.GetKeyState(winrt::Windows::System::VirtualKey::Shift), CoreVirtualKeyStates::Down);
|
||||
|
||||
// GH#11076:
|
||||
// For some weird reason we sometimes receive a WM_KEYDOWN
|
||||
// message without vkey or scanCode if a user drags a tab.
|
||||
// The KeyChord constructor has a debug assertion ensuring that all KeyChord
|
||||
// either have a valid vkey/scanCode. This is important, because this prevents
|
||||
// accidential insertion of invalid KeyChords into classes like ActionMap.
|
||||
if (!vkey && !scanCode)
|
||||
winrt::Microsoft::Terminal::Control::KeyChord kc{ ctrlDown, altDown, shiftDown, false, static_cast<int32_t>(key), static_cast<int32_t>(scanCode) };
|
||||
if (const auto cmd{ _settings.ActionMap().GetActionByKeyChord(kc) })
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// Alt-Numpad# input will send us a character once the user releases
|
||||
// Alt, so we should be ignoring the individual keydowns. The character
|
||||
// will be sent through the TSFInputControl. See GH#1401 for more
|
||||
// details
|
||||
if (modifiers.IsAltPressed() && (vkey >= VK_NUMPAD0 && vkey <= VK_NUMPAD9))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// GH#2235: Terminal::Settings hasn't been modified to differentiate
|
||||
// between AltGr and Ctrl+Alt yet.
|
||||
// -> Don't check for key bindings if this is an AltGr key combination.
|
||||
if (modifiers.IsAltGrPressed())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
const auto actionMap = _settings.ActionMap();
|
||||
if (!actionMap)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
const auto cmd = actionMap.GetActionByKeyChord({
|
||||
modifiers.IsCtrlPressed(),
|
||||
modifiers.IsAltPressed(),
|
||||
modifiers.IsShiftPressed(),
|
||||
modifiers.IsWinPressed(),
|
||||
vkey,
|
||||
scanCode,
|
||||
});
|
||||
if (!cmd)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (!_actionDispatch->DoAction(cmd.ActionAndArgs()))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (const auto p = CommandPalette(); p.Visibility() == Visibility::Visible && cmd.ActionAndArgs().Action() != ShortcutAction::ToggleCommandPalette)
|
||||
{
|
||||
p.Visibility(Visibility::Collapsed);
|
||||
}
|
||||
|
||||
// Let's assume the user has bound the dead key "^" to a sendInput command that sends "b".
|
||||
// If the user presses the two keys "^a" it'll produce "bâ", despite us marking the key event as handled.
|
||||
// The following is used to manually "consume" such dead keys and clear them from the keyboard state.
|
||||
_ClearKeyboardState(vkey, scanCode);
|
||||
e.Handled(true);
|
||||
}
|
||||
|
||||
// Method Description:
|
||||
// - Get the modifier keys that are currently pressed. This can be used to
|
||||
// find out which modifiers (ctrl, alt, shift) are pressed in events that
|
||||
// don't necessarily include that state.
|
||||
// - This is a copy of TermControl::_GetPressedModifierKeys.
|
||||
// Return Value:
|
||||
// - The Microsoft::Terminal::Core::ControlKeyStates representing the modifier key states.
|
||||
ControlKeyStates TerminalPage::_GetPressedModifierKeys() noexcept
|
||||
{
|
||||
const CoreWindow window = CoreWindow::GetForCurrentThread();
|
||||
// DONT USE
|
||||
// != CoreVirtualKeyStates::None
|
||||
// OR
|
||||
// == CoreVirtualKeyStates::Down
|
||||
// Sometimes with the key down, the state is Down | Locked.
|
||||
// Sometimes with the key up, the state is Locked.
|
||||
// IsFlagSet(Down) is the only correct solution.
|
||||
|
||||
struct KeyModifier
|
||||
{
|
||||
VirtualKey vkey;
|
||||
ControlKeyStates flags;
|
||||
};
|
||||
|
||||
constexpr std::array<KeyModifier, 7> modifiers{ {
|
||||
{ VirtualKey::RightMenu, ControlKeyStates::RightAltPressed },
|
||||
{ VirtualKey::LeftMenu, ControlKeyStates::LeftAltPressed },
|
||||
{ VirtualKey::RightControl, ControlKeyStates::RightCtrlPressed },
|
||||
{ VirtualKey::LeftControl, ControlKeyStates::LeftCtrlPressed },
|
||||
{ VirtualKey::Shift, ControlKeyStates::ShiftPressed },
|
||||
{ VirtualKey::RightWindows, ControlKeyStates::RightWinPressed },
|
||||
{ VirtualKey::LeftWindows, ControlKeyStates::LeftWinPressed },
|
||||
} };
|
||||
|
||||
ControlKeyStates flags;
|
||||
|
||||
for (const auto& mod : modifiers)
|
||||
{
|
||||
const auto state = window.GetKeyState(mod.vkey);
|
||||
const auto isDown = WI_IsFlagSet(state, CoreVirtualKeyStates::Down);
|
||||
|
||||
if (isDown)
|
||||
if (CommandPalette().Visibility() == Visibility::Visible && cmd.ActionAndArgs().Action() != ShortcutAction::ToggleCommandPalette)
|
||||
{
|
||||
flags |= mod.flags;
|
||||
CommandPalette().Visibility(Visibility::Collapsed);
|
||||
}
|
||||
}
|
||||
|
||||
return flags;
|
||||
}
|
||||
|
||||
// Method Description:
|
||||
// - Discards currently pressed dead keys.
|
||||
// - This is a copy of TermControl::_ClearKeyboardState.
|
||||
// Arguments:
|
||||
// - vkey: The vkey of the key pressed.
|
||||
// - scanCode: The scan code of the key pressed.
|
||||
void TerminalPage::_ClearKeyboardState(const WORD vkey, const WORD scanCode) noexcept
|
||||
{
|
||||
std::array<BYTE, 256> keyState;
|
||||
if (!GetKeyboardState(keyState.data()))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// As described in "Sometimes you *want* to interfere with the keyboard's state buffer":
|
||||
// http://archives.miloush.net/michkap/archive/2006/09/10/748775.html
|
||||
// > "The key here is to keep trying to pass stuff to ToUnicode until -1 is not returned."
|
||||
std::array<wchar_t, 16> buffer;
|
||||
while (ToUnicodeEx(vkey, scanCode, keyState.data(), buffer.data(), gsl::narrow_cast<int>(buffer.size()), 0b1, nullptr) < 0)
|
||||
{
|
||||
_actionDispatch->DoAction(cmd.ActionAndArgs());
|
||||
e.Handled(true);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2247,13 +2123,10 @@ namespace winrt::TerminalApp::implementation
|
|||
|
||||
TermControl TerminalPage::_InitControl(const TerminalSettingsCreateResult& settings, const ITerminalConnection& connection)
|
||||
{
|
||||
// Give term control a child of the settings so that any overrides go in the child
|
||||
// This way, when we do a settings reload we just update the parent and the overrides remain
|
||||
const auto child = TerminalSettings::CreateWithParent(settings);
|
||||
TermControl term{ child.DefaultSettings(), connection };
|
||||
|
||||
term.UnfocusedAppearance(child.UnfocusedSettings()); // It is okay for the unfocused settings to be null
|
||||
|
||||
// Do any initialization that needs to apply to _every_ TermControl we
|
||||
// create here.
|
||||
// TermControl will copy the settings out of the settings passed to it.
|
||||
TermControl term{ settings.DefaultSettings(), settings.UnfocusedSettings(), connection };
|
||||
return term;
|
||||
}
|
||||
|
||||
|
|
|
@ -14,17 +14,12 @@
|
|||
|
||||
static constexpr uint32_t DefaultRowsToScroll{ 3 };
|
||||
static constexpr std::wstring_view TabletInputServiceKey{ L"TabletInputService" };
|
||||
|
||||
// fwdecl unittest classes
|
||||
namespace TerminalAppLocalTests
|
||||
{
|
||||
class TabTests;
|
||||
class SettingsTests;
|
||||
}
|
||||
|
||||
namespace Microsoft::Terminal::Core
|
||||
{
|
||||
class ControlKeyStates;
|
||||
}
|
||||
};
|
||||
|
||||
namespace winrt::TerminalApp::implementation
|
||||
{
|
||||
|
@ -230,8 +225,6 @@ namespace winrt::TerminalApp::implementation
|
|||
void _ThirdPartyNoticesOnClick(const IInspectable& sender, const Windows::UI::Xaml::RoutedEventArgs& eventArgs);
|
||||
|
||||
void _KeyDownHandler(Windows::Foundation::IInspectable const& sender, Windows::UI::Xaml::Input::KeyRoutedEventArgs const& e);
|
||||
static ::Microsoft::Terminal::Core::ControlKeyStates _GetPressedModifierKeys() noexcept;
|
||||
static void _ClearKeyboardState(const WORD vkey, const WORD scanCode) noexcept;
|
||||
void _HookupKeyBindings(const Microsoft::Terminal::Settings::Model::IActionMapView& actionMap) noexcept;
|
||||
void _RegisterActionCallbacks();
|
||||
|
||||
|
|
|
@ -68,22 +68,5 @@
|
|||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
|
||||
<!--
|
||||
BODGY
|
||||
|
||||
The wapproj `GetResolvedWinMD` target tries to get a winmd from every cppwinrt
|
||||
executable we put in the package. But we DON'T produce a winmd. This makes the
|
||||
FastUpToDate check fail every time, and leads to the whole wapproj build
|
||||
running even if you're just f5'ing the package. EVEN AFTER A SUCCESSFUL BUILD.
|
||||
|
||||
Setting GenerateWindowsMetadata=false is enough to tell the build system that
|
||||
we don't produce one, and get it off our backs.
|
||||
-->
|
||||
<ItemDefinitionGroup>
|
||||
<Link>
|
||||
<GenerateWindowsMetadata>false</GenerateWindowsMetadata>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
|
||||
<Import Project="$(OpenConsoleDir)\build\rules\GenerateSxsManifestsFromWinmds.targets" />
|
||||
</Project>
|
||||
|
|
|
@ -97,39 +97,4 @@
|
|||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<Import Project="$(SolutionDir)build\rules\CollectWildcardResources.targets" />
|
||||
|
||||
<!--
|
||||
BODGY:
|
||||
|
||||
We depend on `cpprest142*.dll`, which comes from our vcpkg dependency. As a
|
||||
part of the vcpkg dependency restore, msbuild will call the `deployBinary()`
|
||||
function in
|
||||
`packages\vcpkg-cpprestsdk.2.10.14\scripts\BuildSystems\msbuild\AppLocal.ps1`.
|
||||
That function does the actual job of copying the file. It copies it outside of
|
||||
MsBuild. MsBuild then, in the `_CopyFilesMarkedCopyLocal` target, determines
|
||||
that it needs to copy `cpprest142*.dll`, because that dll is a member of
|
||||
`@(ReferencesCopiedInThisBuild)`. However, the file's already been copied, so
|
||||
MsBuild never copies it. But that also prevents MsBuild from setting
|
||||
`WroteAtLeastOneFile`, which then means that MsBuild will never create the
|
||||
.CopyComplete file for this project.
|
||||
|
||||
Because that file is missing, MsBuild will never think the project is up to
|
||||
date, and the FastUpToDate check in VS will always force MsBuild to run a pass
|
||||
on this project.
|
||||
|
||||
To mitigate this, we're adding this other target here, which runs after
|
||||
_CopyFilesMarkedCopyLocal, and always creates the CopyUpToDateMarker. This
|
||||
makes the FastUpToDate check succeed.
|
||||
-->
|
||||
|
||||
<Target
|
||||
Name="_Post_CopyFilesMarkedCopyLocal"
|
||||
AfterTargets="_CopyFilesMarkedCopyLocal"
|
||||
Condition="'@(ReferenceCopyLocalPaths)' != ''">
|
||||
|
||||
<Touch Files="@(CopyUpToDateMarker)"
|
||||
AlwaysCreate="true" />
|
||||
</Target>
|
||||
|
||||
|
||||
</Project>
|
||||
</Project>
|
49
src/cascadia/TerminalControl/ControlAppearance.h
Normal file
49
src/cascadia/TerminalControl/ControlAppearance.h
Normal file
|
@ -0,0 +1,49 @@
|
|||
/*++
|
||||
Copyright (c) Microsoft Corporation
|
||||
Licensed under the MIT license.
|
||||
--*/
|
||||
#pragma once
|
||||
#include "../../inc/cppwinrt_utils.h"
|
||||
#include "../../inc/ControlProperties.h"
|
||||
|
||||
#include <DefaultSettings.h>
|
||||
#include <conattrs.hpp>
|
||||
|
||||
namespace winrt::Microsoft::Terminal::Control::implementation
|
||||
{
|
||||
struct ControlAppearance : public winrt::implements<ControlAppearance, Microsoft::Terminal::Core::ICoreAppearance, Microsoft::Terminal::Control::IControlAppearance>
|
||||
{
|
||||
#define SETTINGS_GEN(type, name, ...) WINRT_PROPERTY(type, name, __VA_ARGS__);
|
||||
CORE_APPEARANCE_SETTINGS(SETTINGS_GEN)
|
||||
CONTROL_APPEARANCE_SETTINGS(SETTINGS_GEN)
|
||||
#undef SETTINGS_GEN
|
||||
|
||||
private:
|
||||
// Color Table is special because it's an array
|
||||
std::array<winrt::Microsoft::Terminal::Core::Color, COLOR_TABLE_SIZE> _ColorTable;
|
||||
|
||||
public:
|
||||
winrt::Microsoft::Terminal::Core::Color GetColorTableEntry(int32_t index) noexcept
|
||||
{
|
||||
return _ColorTable.at(index);
|
||||
}
|
||||
void SetColorTableEntry(int32_t index,
|
||||
winrt::Microsoft::Terminal::Core::Color color) noexcept
|
||||
{
|
||||
_ColorTable.at(index) = color;
|
||||
}
|
||||
|
||||
ControlAppearance(Control::IControlAppearance appearance)
|
||||
{
|
||||
#define COPY_SETTING(type, name, ...) _##name = appearance.name();
|
||||
CORE_APPEARANCE_SETTINGS(COPY_SETTING)
|
||||
CONTROL_APPEARANCE_SETTINGS(COPY_SETTING)
|
||||
#undef COPY_SETTING
|
||||
|
||||
for (size_t i = 0; i < _ColorTable.size(); i++)
|
||||
{
|
||||
_ColorTable[i] = appearance.GetColorTableEntry(static_cast<int32_t>(i));
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
|
@ -56,15 +56,17 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
return initialized;
|
||||
}
|
||||
|
||||
ControlCore::ControlCore(IControlSettings settings,
|
||||
ControlCore::ControlCore(Control::IControlSettings settings,
|
||||
Control::IControlAppearance unfocusedAppearance,
|
||||
TerminalConnection::ITerminalConnection connection) :
|
||||
_connection{ connection },
|
||||
_settings{ settings },
|
||||
_desiredFont{ DEFAULT_FONT_FACE, 0, DEFAULT_FONT_WEIGHT, { 0, DEFAULT_FONT_SIZE }, CP_UTF8 },
|
||||
_actualFont{ DEFAULT_FONT_FACE, 0, DEFAULT_FONT_WEIGHT, { 0, DEFAULT_FONT_SIZE }, CP_UTF8, false }
|
||||
{
|
||||
_EnsureStaticInitialization();
|
||||
|
||||
_settings = winrt::make_self<implementation::ControlSettings>(settings, unfocusedAppearance);
|
||||
|
||||
_terminal = std::make_unique<::Microsoft::Terminal::Core::Terminal>();
|
||||
|
||||
// Subscribe to the connection's disconnected event and call our connection closed handlers.
|
||||
|
@ -80,7 +82,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
});
|
||||
|
||||
// GH#8969: pre-seed working directory to prevent potential races
|
||||
_terminal->SetWorkingDirectory(_settings.StartingDirectory());
|
||||
_terminal->SetWorkingDirectory(_settings->StartingDirectory());
|
||||
|
||||
auto pfnCopyToClipboard = std::bind(&ControlCore::_terminalCopyToClipboard, this, std::placeholders::_1);
|
||||
_terminal->SetCopyToClipboardCallback(pfnCopyToClipboard);
|
||||
|
@ -187,7 +189,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
}
|
||||
});
|
||||
|
||||
UpdateSettings(settings);
|
||||
UpdateSettings(settings, unfocusedAppearance);
|
||||
}
|
||||
|
||||
ControlCore::~ControlCore()
|
||||
|
@ -226,7 +228,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
return false;
|
||||
}
|
||||
|
||||
if (Feature_AtlasEngine::IsEnabled() && _settings.UseAtlasEngine())
|
||||
if (Feature_AtlasEngine::IsEnabled() && _settings->UseAtlasEngine())
|
||||
{
|
||||
_renderEngine = std::make_unique<::Microsoft::Console::Render::AtlasEngine>();
|
||||
}
|
||||
|
@ -252,7 +254,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
LOG_IF_FAILED(_renderEngine->SetWindowSize({ viewInPixels.Width(), viewInPixels.Height() }));
|
||||
|
||||
// Update DxEngine's SelectionBackground
|
||||
_renderEngine->SetSelectionBackground(til::color{ _settings.SelectionBackground() });
|
||||
_renderEngine->SetSelectionBackground(til::color{ _settings->SelectionBackground() });
|
||||
|
||||
const auto vp = _renderEngine->GetViewportInCharacters(viewInPixels);
|
||||
const auto width = vp.Width();
|
||||
|
@ -260,10 +262,10 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
_connection.Resize(height, width);
|
||||
|
||||
// Override the default width and height to match the size of the swapChainPanel
|
||||
_settings.InitialCols(width);
|
||||
_settings.InitialRows(height);
|
||||
_settings->InitialCols(width);
|
||||
_settings->InitialRows(height);
|
||||
|
||||
_terminal->CreateFromSettings(_settings, *_renderer);
|
||||
_terminal->CreateFromSettings(*_settings, *_renderer);
|
||||
|
||||
// IMPORTANT! Set this callback up sooner than later. If we do it
|
||||
// after Enable, then it'll be possible to paint the frame once
|
||||
|
@ -275,18 +277,17 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
// We do this after we initially set the swapchain so as to avoid unnecessary callbacks (and locking problems)
|
||||
_renderEngine->SetCallback(std::bind(&ControlCore::_renderEngineSwapChainChanged, this));
|
||||
|
||||
_renderEngine->SetRetroTerminalEffect(_settings.RetroTerminalEffect());
|
||||
_renderEngine->SetPixelShaderPath(_settings.PixelShaderPath());
|
||||
_renderEngine->SetForceFullRepaintRendering(_settings.ForceFullRepaintRendering());
|
||||
_renderEngine->SetSoftwareRendering(_settings.SoftwareRendering());
|
||||
_renderEngine->SetIntenseIsBold(_settings.IntenseIsBold());
|
||||
_renderEngine->SetRetroTerminalEffect(_settings->RetroTerminalEffect());
|
||||
_renderEngine->SetPixelShaderPath(_settings->PixelShaderPath());
|
||||
_renderEngine->SetForceFullRepaintRendering(_settings->ForceFullRepaintRendering());
|
||||
_renderEngine->SetSoftwareRendering(_settings->SoftwareRendering());
|
||||
_renderEngine->SetIntenseIsBold(_settings->IntenseIsBold());
|
||||
|
||||
_updateAntiAliasingMode();
|
||||
|
||||
// GH#5098: Inform the engine of the opacity of the default text background.
|
||||
// GH#11315: Always do this, even if they don't have acrylic on.
|
||||
const auto backgroundIsOpaque = _settings.Opacity() == 1.0 && _settings.BackgroundImage().empty();
|
||||
_renderEngine->SetDefaultTextBackgroundOpacity(static_cast<float>(backgroundIsOpaque));
|
||||
_renderEngine->EnableTransparentBackground(_isBackgroundTransparent());
|
||||
|
||||
THROW_IF_FAILED(_renderEngine->Enable());
|
||||
|
||||
|
@ -444,14 +445,13 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
return;
|
||||
}
|
||||
|
||||
auto newOpacity = std::clamp(_settings.Opacity() + adjustment,
|
||||
auto newOpacity = std::clamp(Opacity() + adjustment,
|
||||
0.0,
|
||||
1.0);
|
||||
|
||||
// GH#5098: Inform the engine of the new opacity of the default text background.
|
||||
SetBackgroundOpacity(::base::saturated_cast<float>(newOpacity));
|
||||
|
||||
_settings.Opacity(newOpacity);
|
||||
auto lock = _terminal->LockForWriting();
|
||||
// Update our runtime opacity value
|
||||
Opacity(newOpacity);
|
||||
|
||||
// GH#11285 - If the user is on Windows 10, and they changed the
|
||||
// transparency of the control s.t. it should be partially opaque, then
|
||||
|
@ -461,7 +461,14 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
// is what the Terminal did prior to 1.12.
|
||||
if (!IsVintageOpacityAvailable())
|
||||
{
|
||||
_settings.UseAcrylic(newOpacity < 1.0);
|
||||
_runtimeUseAcrylic = newOpacity < 1.0;
|
||||
}
|
||||
|
||||
// Update the renderer as well. It might need to fall back from
|
||||
// cleartype -> grayscale if the BG is transparent / acrylic.
|
||||
if (_renderEngine)
|
||||
{
|
||||
_renderEngine->EnableTransparentBackground(_isBackgroundTransparent());
|
||||
}
|
||||
|
||||
auto eventArgs = winrt::make_self<TransparencyChangedEventArgs>(newOpacity);
|
||||
|
@ -476,7 +483,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
// specify a custom pixel shader, manually enable the legacy retro
|
||||
// effect first. This will ensure that a toggle off->on will still work,
|
||||
// even if they currently have retro effect off.
|
||||
if (_settings.PixelShaderPath().empty() && !_renderEngine->GetRetroTerminalEffect())
|
||||
if (_settings->PixelShaderPath().empty() && !_renderEngine->GetRetroTerminalEffect())
|
||||
{
|
||||
// SetRetroTerminalEffect to true will enable the effect. In this
|
||||
// case, the shader effect will already be disabled (because neither
|
||||
|
@ -586,24 +593,27 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
// Method Description:
|
||||
// - Updates the settings of the current terminal.
|
||||
// - INVARIANT: This method can only be called if the caller DOES NOT HAVE writing lock on the terminal.
|
||||
void ControlCore::UpdateSettings(const IControlSettings& settings)
|
||||
void ControlCore::UpdateSettings(const IControlSettings& settings, const IControlAppearance& newAppearance)
|
||||
{
|
||||
_settings = winrt::make_self<implementation::ControlSettings>(settings, newAppearance);
|
||||
|
||||
auto lock = _terminal->LockForWriting();
|
||||
|
||||
_settings = settings;
|
||||
_runtimeOpacity = std::nullopt;
|
||||
_runtimeUseAcrylic = std::nullopt;
|
||||
|
||||
// GH#11285 - If the user is on Windows 10, and they wanted opacity, but
|
||||
// didn't explicitly request acrylic, then opt them in to acrylic.
|
||||
// On Windows 11+, this isn't needed, because we can have vintage opacity.
|
||||
if (!IsVintageOpacityAvailable() && _settings.Opacity() < 1.0 && !_settings.UseAcrylic())
|
||||
if (!IsVintageOpacityAvailable() && _settings->Opacity() < 1.0 && !_settings->UseAcrylic())
|
||||
{
|
||||
_settings.UseAcrylic(true);
|
||||
_runtimeUseAcrylic = true;
|
||||
}
|
||||
|
||||
// Initialize our font information.
|
||||
const auto fontFace = _settings.FontFace();
|
||||
const short fontHeight = ::base::saturated_cast<short>(_settings.FontSize());
|
||||
const auto fontWeight = _settings.FontWeight();
|
||||
const auto fontFace = _settings->FontFace();
|
||||
const short fontHeight = ::base::saturated_cast<short>(_settings->FontSize());
|
||||
const auto fontWeight = _settings->FontWeight();
|
||||
// The font width doesn't terribly matter, we'll only be using the
|
||||
// height to look it up
|
||||
// The other params here also largely don't matter.
|
||||
|
@ -615,7 +625,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
_desiredFont = { _actualFont };
|
||||
|
||||
// Update the terminal core with its new Core settings
|
||||
_terminal->UpdateSettings(_settings);
|
||||
_terminal->UpdateSettings(*_settings);
|
||||
|
||||
if (!_initializedTerminal)
|
||||
{
|
||||
|
@ -624,8 +634,10 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
return;
|
||||
}
|
||||
|
||||
_renderEngine->SetForceFullRepaintRendering(_settings.ForceFullRepaintRendering());
|
||||
_renderEngine->SetSoftwareRendering(_settings.SoftwareRendering());
|
||||
_renderEngine->SetForceFullRepaintRendering(_settings->ForceFullRepaintRendering());
|
||||
_renderEngine->SetSoftwareRendering(_settings->SoftwareRendering());
|
||||
// Inform the renderer of our opacity
|
||||
_renderEngine->EnableTransparentBackground(_isBackgroundTransparent());
|
||||
|
||||
_updateAntiAliasingMode();
|
||||
|
||||
|
@ -642,21 +654,21 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
// Method Description:
|
||||
// - Updates the appearance of the current terminal.
|
||||
// - INVARIANT: This method can only be called if the caller DOES NOT HAVE writing lock on the terminal.
|
||||
void ControlCore::UpdateAppearance(const IControlAppearance& newAppearance)
|
||||
void ControlCore::ApplyAppearance(const bool& focused)
|
||||
{
|
||||
auto lock = _terminal->LockForWriting();
|
||||
|
||||
const auto& newAppearance{ focused ? _settings->FocusedAppearance() : _settings->UnfocusedAppearance() };
|
||||
// Update the terminal core with its new Core settings
|
||||
_terminal->UpdateAppearance(newAppearance);
|
||||
_terminal->UpdateAppearance(*newAppearance);
|
||||
|
||||
// Update DxEngine settings under the lock
|
||||
if (_renderEngine)
|
||||
{
|
||||
// Update DxEngine settings under the lock
|
||||
_renderEngine->SetSelectionBackground(til::color{ newAppearance.SelectionBackground() });
|
||||
_renderEngine->SetRetroTerminalEffect(newAppearance.RetroTerminalEffect());
|
||||
_renderEngine->SetPixelShaderPath(newAppearance.PixelShaderPath());
|
||||
_renderEngine->SetIntenseIsBold(_settings.IntenseIsBold());
|
||||
_renderEngine->SetSelectionBackground(til::color{ newAppearance->SelectionBackground() });
|
||||
_renderEngine->SetRetroTerminalEffect(newAppearance->RetroTerminalEffect());
|
||||
_renderEngine->SetPixelShaderPath(newAppearance->PixelShaderPath());
|
||||
_renderEngine->SetIntenseIsBold(_settings->IntenseIsBold());
|
||||
_renderer->TriggerRedrawAll();
|
||||
}
|
||||
}
|
||||
|
@ -664,8 +676,8 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
void ControlCore::_updateAntiAliasingMode()
|
||||
{
|
||||
D2D1_TEXT_ANTIALIAS_MODE mode;
|
||||
|
||||
switch (_settings.AntialiasingMode())
|
||||
// Update DxEngine's AntialiasingMode
|
||||
switch (_settings->AntialiasingMode())
|
||||
{
|
||||
case TextAntialiasingMode::Cleartype:
|
||||
mode = D2D1_TEXT_ANTIALIAS_MODE_CLEARTYPE;
|
||||
|
@ -701,7 +713,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
if (_renderEngine)
|
||||
{
|
||||
std::unordered_map<std::wstring_view, uint32_t> featureMap;
|
||||
if (const auto fontFeatures = _settings.FontFeatures())
|
||||
if (const auto fontFeatures = _settings->FontFeatures())
|
||||
{
|
||||
featureMap.reserve(fontFeatures.Size());
|
||||
|
||||
|
@ -711,7 +723,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
}
|
||||
}
|
||||
std::unordered_map<std::wstring_view, float> axesMap;
|
||||
if (const auto fontAxes = _settings.FontAxes())
|
||||
if (const auto fontAxes = _settings->FontAxes())
|
||||
{
|
||||
axesMap.reserve(fontAxes.Size());
|
||||
|
||||
|
@ -753,8 +765,8 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
{
|
||||
// Make sure we have a non-zero font size
|
||||
const auto newSize = std::max<short>(gsl::narrow_cast<short>(fontSize), 1);
|
||||
const auto fontFace = _settings.FontFace();
|
||||
const auto fontWeight = _settings.FontWeight();
|
||||
const auto fontFace = _settings->FontFace();
|
||||
const auto fontWeight = _settings->FontWeight();
|
||||
_actualFont = { fontFace, 0, fontWeight.Weight, { 0, newSize }, CP_UTF8, false };
|
||||
_actualFontFaceName = { fontFace };
|
||||
_desiredFont = { _actualFont };
|
||||
|
@ -779,7 +791,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
// - none
|
||||
void ControlCore::ResetFontSize()
|
||||
{
|
||||
_setFontSize(_settings.FontSize());
|
||||
_setFontSize(_settings->FontSize());
|
||||
}
|
||||
|
||||
// Method Description:
|
||||
|
@ -991,7 +1003,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
TextBuffer::GenHTML(bufferData,
|
||||
_actualFont.GetUnscaledSize().Y,
|
||||
_actualFont.GetFaceName(),
|
||||
til::color{ _settings.DefaultBackground() }) :
|
||||
til::color{ _settings->DefaultBackground() }) :
|
||||
"";
|
||||
|
||||
// convert to RTF format
|
||||
|
@ -999,10 +1011,10 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
TextBuffer::GenRTF(bufferData,
|
||||
_actualFont.GetUnscaledSize().Y,
|
||||
_actualFont.GetFaceName(),
|
||||
til::color{ _settings.DefaultBackground() }) :
|
||||
til::color{ _settings->DefaultBackground() }) :
|
||||
"";
|
||||
|
||||
if (!_settings.CopyOnSelect())
|
||||
if (!_settings->CopyOnSelect())
|
||||
{
|
||||
_terminal->ClearSelection();
|
||||
_renderer->TriggerSelection();
|
||||
|
@ -1089,7 +1101,10 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
|
||||
til::color ControlCore::BackgroundColor() const
|
||||
{
|
||||
return _terminal->GetColorTableEntry(TextColor::DEFAULT_BACKGROUND);
|
||||
// The Terminal internally stores it's BG with 0 opacity, so as to allow
|
||||
// DX to paint the BG color transparently. We however don't want to leak
|
||||
// that implementation detail.
|
||||
return _terminal->GetDefaultBackground().with_alpha(0xff);
|
||||
}
|
||||
|
||||
// Method Description:
|
||||
|
@ -1246,7 +1261,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
|
||||
bool ControlCore::CopyOnSelect() const
|
||||
{
|
||||
return _settings.CopyOnSelect();
|
||||
return _settings->CopyOnSelect();
|
||||
}
|
||||
|
||||
Windows::Foundation::Collections::IVector<winrt::hstring> ControlCore::SelectedText(bool trimTrailingWhitespace) const
|
||||
|
@ -1304,16 +1319,6 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
}
|
||||
}
|
||||
|
||||
void ControlCore::SetBackgroundOpacity(const double opacity)
|
||||
{
|
||||
if (_renderEngine)
|
||||
{
|
||||
auto lock = _terminal->LockForWriting();
|
||||
const auto backgroundIsOpaque = opacity == 1.0 && _settings.BackgroundImage().empty();
|
||||
_renderEngine->SetDefaultTextBackgroundOpacity(static_cast<float>(backgroundIsOpaque));
|
||||
}
|
||||
}
|
||||
|
||||
// Method Description:
|
||||
// - Asynchronously close our connection. The Connection will likely wait
|
||||
// until the attached process terminates before Close returns. If that's
|
||||
|
@ -1599,4 +1604,125 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
|
||||
return VerifyVersionInfoW(&osver, VER_BUILDNUMBER, dwlConditionMask) != FALSE;
|
||||
}
|
||||
|
||||
Core::Scheme ControlCore::ColorScheme() const noexcept
|
||||
{
|
||||
Core::Scheme s;
|
||||
|
||||
// This part is definitely a hack.
|
||||
//
|
||||
// This function is usually used by the "Preview Color Scheme"
|
||||
// functionality in TerminalPage. If we've got an unfocused appearance,
|
||||
// then we've applied that appearance before this is even getting called
|
||||
// (because the command palette is open with focus on top of us). If we
|
||||
// return the _current_ colors now, we'll return out the _unfocused_
|
||||
// colors. If we do that, and the user dismisses the command palette,
|
||||
// then the scheme that will get restored is the _unfocused_ one, which
|
||||
// is not what we want.
|
||||
//
|
||||
// So if that's the case, then let's grab the colors from the focused
|
||||
// appearance as the scheme instead. We'll lose any current runtime
|
||||
// changes to the color table, but those were already blown away when we
|
||||
// switched to an unfocused appearance.
|
||||
//
|
||||
// IF WE DON'T HAVE AN UNFOCUSED APPEARANCE: then just ask the Terminal
|
||||
// for it's current color table. That way, we can restore those colors
|
||||
// back.
|
||||
if (HasUnfocusedAppearance())
|
||||
{
|
||||
s.Foreground = _settings->FocusedAppearance()->DefaultForeground();
|
||||
s.Background = _settings->FocusedAppearance()->DefaultBackground();
|
||||
|
||||
s.CursorColor = _settings->FocusedAppearance()->CursorColor();
|
||||
|
||||
s.Black = _settings->FocusedAppearance()->GetColorTableEntry(0);
|
||||
s.Red = _settings->FocusedAppearance()->GetColorTableEntry(1);
|
||||
s.Green = _settings->FocusedAppearance()->GetColorTableEntry(2);
|
||||
s.Yellow = _settings->FocusedAppearance()->GetColorTableEntry(3);
|
||||
s.Blue = _settings->FocusedAppearance()->GetColorTableEntry(4);
|
||||
s.Purple = _settings->FocusedAppearance()->GetColorTableEntry(5);
|
||||
s.Cyan = _settings->FocusedAppearance()->GetColorTableEntry(6);
|
||||
s.White = _settings->FocusedAppearance()->GetColorTableEntry(7);
|
||||
s.BrightBlack = _settings->FocusedAppearance()->GetColorTableEntry(8);
|
||||
s.BrightRed = _settings->FocusedAppearance()->GetColorTableEntry(9);
|
||||
s.BrightGreen = _settings->FocusedAppearance()->GetColorTableEntry(10);
|
||||
s.BrightYellow = _settings->FocusedAppearance()->GetColorTableEntry(11);
|
||||
s.BrightBlue = _settings->FocusedAppearance()->GetColorTableEntry(12);
|
||||
s.BrightPurple = _settings->FocusedAppearance()->GetColorTableEntry(13);
|
||||
s.BrightCyan = _settings->FocusedAppearance()->GetColorTableEntry(14);
|
||||
s.BrightWhite = _settings->FocusedAppearance()->GetColorTableEntry(15);
|
||||
}
|
||||
else
|
||||
{
|
||||
s = _terminal->GetColorScheme();
|
||||
}
|
||||
|
||||
// This might be a tad bit of a hack. This event only gets called by set
|
||||
// color scheme / preview color scheme, and in that case, we know the
|
||||
// control _is_ focused.
|
||||
s.SelectionBackground = _settings->FocusedAppearance()->SelectionBackground();
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
// Method Description:
|
||||
// - Apply the given color scheme to this control. We'll take the colors out
|
||||
// of it and apply them to our focused appearance, and update the terminal
|
||||
// buffer with the new color table.
|
||||
// - This is here to support the Set Color Scheme action, and the ability to
|
||||
// preview schemes in the control.
|
||||
// Arguments:
|
||||
// - scheme: the collection of colors to apply.
|
||||
// Return Value:
|
||||
// - <none>
|
||||
void ControlCore::ColorScheme(const Core::Scheme& scheme)
|
||||
{
|
||||
auto l{ _terminal->LockForWriting() };
|
||||
|
||||
_settings->FocusedAppearance()->DefaultForeground(scheme.Foreground);
|
||||
_settings->FocusedAppearance()->DefaultBackground(scheme.Background);
|
||||
_settings->FocusedAppearance()->CursorColor(scheme.CursorColor);
|
||||
_settings->FocusedAppearance()->SelectionBackground(scheme.SelectionBackground);
|
||||
|
||||
_settings->FocusedAppearance()->SetColorTableEntry(0, scheme.Black);
|
||||
_settings->FocusedAppearance()->SetColorTableEntry(1, scheme.Red);
|
||||
_settings->FocusedAppearance()->SetColorTableEntry(2, scheme.Green);
|
||||
_settings->FocusedAppearance()->SetColorTableEntry(3, scheme.Yellow);
|
||||
_settings->FocusedAppearance()->SetColorTableEntry(4, scheme.Blue);
|
||||
_settings->FocusedAppearance()->SetColorTableEntry(5, scheme.Purple);
|
||||
_settings->FocusedAppearance()->SetColorTableEntry(6, scheme.Cyan);
|
||||
_settings->FocusedAppearance()->SetColorTableEntry(7, scheme.White);
|
||||
_settings->FocusedAppearance()->SetColorTableEntry(8, scheme.BrightBlack);
|
||||
_settings->FocusedAppearance()->SetColorTableEntry(9, scheme.BrightRed);
|
||||
_settings->FocusedAppearance()->SetColorTableEntry(10, scheme.BrightGreen);
|
||||
_settings->FocusedAppearance()->SetColorTableEntry(11, scheme.BrightYellow);
|
||||
_settings->FocusedAppearance()->SetColorTableEntry(12, scheme.BrightBlue);
|
||||
_settings->FocusedAppearance()->SetColorTableEntry(13, scheme.BrightPurple);
|
||||
_settings->FocusedAppearance()->SetColorTableEntry(14, scheme.BrightCyan);
|
||||
_settings->FocusedAppearance()->SetColorTableEntry(15, scheme.BrightWhite);
|
||||
|
||||
_terminal->ApplyScheme(scheme);
|
||||
_renderEngine->SetSelectionBackground(til::color{ _settings->SelectionBackground() });
|
||||
|
||||
_renderer->TriggerRedrawAll();
|
||||
_BackgroundColorChangedHandlers(*this, nullptr);
|
||||
}
|
||||
|
||||
bool ControlCore::HasUnfocusedAppearance() const
|
||||
{
|
||||
return _settings->HasUnfocusedAppearance();
|
||||
}
|
||||
|
||||
bool ControlCore::_isBackgroundTransparent()
|
||||
{
|
||||
// If we're:
|
||||
// * Not fully opaque
|
||||
// * On an acrylic background (of any opacity)
|
||||
// * rendering on top of an image
|
||||
//
|
||||
// then the renderer should not render "default background" text with a
|
||||
// fully opaque background. Doing that would cover up our nice
|
||||
// transparency, or our acrylic, or our image.
|
||||
return Opacity() < 1.0f || UseAcrylic() || !_settings->BackgroundImage().empty();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -16,23 +16,35 @@
|
|||
#pragma once
|
||||
|
||||
#include "ControlCore.g.h"
|
||||
#include "ControlSettings.h"
|
||||
#include "../../renderer/base/Renderer.hpp"
|
||||
#include "../../cascadia/TerminalCore/Terminal.hpp"
|
||||
#include "../buffer/out/search.h"
|
||||
#include "cppwinrt_utils.h"
|
||||
|
||||
#include <til/ticket_lock.h>
|
||||
|
||||
namespace ControlUnitTests
|
||||
{
|
||||
class ControlCoreTests;
|
||||
class ControlInteractivityTests;
|
||||
};
|
||||
|
||||
#define RUNTIME_SETTING(type, name, setting) \
|
||||
private: \
|
||||
std::optional<type> _runtime##name{ std::nullopt }; \
|
||||
void name(const type newValue) { _runtime##name = newValue; } \
|
||||
\
|
||||
public: \
|
||||
type name() const { return til::coalesce_value(_runtime##name, setting); }
|
||||
|
||||
namespace winrt::Microsoft::Terminal::Control::implementation
|
||||
{
|
||||
struct ControlCore : ControlCoreT<ControlCore>
|
||||
{
|
||||
public:
|
||||
ControlCore(IControlSettings settings,
|
||||
ControlCore(Control::IControlSettings settings,
|
||||
Control::IControlAppearance unfocusedAppearance,
|
||||
TerminalConnection::ITerminalConnection connection);
|
||||
~ControlCore();
|
||||
|
||||
|
@ -41,8 +53,16 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
const double compositionScale);
|
||||
void EnablePainting();
|
||||
|
||||
void UpdateSettings(const IControlSettings& settings);
|
||||
void UpdateAppearance(const IControlAppearance& newAppearance);
|
||||
void UpdateSettings(const Control::IControlSettings& settings, const IControlAppearance& newAppearance);
|
||||
void ApplyAppearance(const bool& focused);
|
||||
Control::IControlSettings Settings() { return *_settings; };
|
||||
Control::IControlAppearance FocusedAppearance() const { return *_settings->FocusedAppearance(); };
|
||||
Control::IControlAppearance UnfocusedAppearance() const { return *_settings->UnfocusedAppearance(); };
|
||||
bool HasUnfocusedAppearance() const;
|
||||
|
||||
winrt::Microsoft::Terminal::Core::Scheme ColorScheme() const noexcept;
|
||||
void ColorScheme(const winrt::Microsoft::Terminal::Core::Scheme& scheme);
|
||||
|
||||
void SizeChanged(const double width, const double height);
|
||||
void ScaleChanged(const double scale);
|
||||
uint64_t SwapChainHandle() const;
|
||||
|
@ -57,7 +77,6 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
uint16_t FontWeight() const noexcept;
|
||||
|
||||
til::color BackgroundColor() const;
|
||||
void SetBackgroundOpacity(const double opacity);
|
||||
|
||||
void SendInput(const winrt::hstring& wstr);
|
||||
void PasteText(const winrt::hstring& hstr);
|
||||
|
@ -148,6 +167,9 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
|
||||
static bool IsVintageOpacityAvailable() noexcept;
|
||||
|
||||
RUNTIME_SETTING(double, Opacity, _settings->Opacity());
|
||||
RUNTIME_SETTING(bool, UseAcrylic, _settings->UseAcrylic());
|
||||
|
||||
// -------------------------------- WinRT Events ---------------------------------
|
||||
// clang-format off
|
||||
WINRT_CALLBACK(FontSizeChanged, Control::FontSizeChangedEventArgs);
|
||||
|
@ -178,6 +200,8 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
event_token _connectionOutputEventToken;
|
||||
TerminalConnection::ITerminalConnection::StateChanged_revoker _connectionStateChangedRevoker;
|
||||
|
||||
winrt::com_ptr<ControlSettings> _settings{ nullptr };
|
||||
|
||||
std::unique_ptr<::Microsoft::Terminal::Core::Terminal> _terminal{ nullptr };
|
||||
|
||||
// NOTE: _renderEngine must be ordered before _renderer.
|
||||
|
@ -188,8 +212,6 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
std::unique_ptr<::Microsoft::Console::Render::IRenderEngine> _renderEngine{ nullptr };
|
||||
std::unique_ptr<::Microsoft::Console::Render::Renderer> _renderer{ nullptr };
|
||||
|
||||
IControlSettings _settings{ nullptr };
|
||||
|
||||
FontInfoDesired _desiredFont;
|
||||
FontInfo _actualFont;
|
||||
winrt::hstring _actualFontFaceName;
|
||||
|
@ -249,6 +271,8 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
void _connectionOutputHandler(const hstring& hstr);
|
||||
void _updateHoveredCell(const std::optional<til::point> terminalPosition);
|
||||
|
||||
bool _isBackgroundTransparent();
|
||||
|
||||
inline bool _IsClosing() const noexcept
|
||||
{
|
||||
#ifndef NDEBUG
|
||||
|
|
|
@ -33,20 +33,27 @@ namespace Microsoft.Terminal.Control
|
|||
[default_interface] runtimeclass ControlCore : ICoreState
|
||||
{
|
||||
ControlCore(IControlSettings settings,
|
||||
IControlAppearance unfocusedAppearance,
|
||||
Microsoft.Terminal.TerminalConnection.ITerminalConnection connection);
|
||||
|
||||
Boolean Initialize(Double actualWidth,
|
||||
Double actualHeight,
|
||||
Double compositionScale);
|
||||
|
||||
void UpdateSettings(IControlSettings settings);
|
||||
void UpdateAppearance(IControlAppearance appearance);
|
||||
void UpdateSettings(IControlSettings settings, IControlAppearance appearance);
|
||||
void ApplyAppearance(Boolean focused);
|
||||
|
||||
IControlSettings Settings { get; };
|
||||
IControlAppearance FocusedAppearance { get; };
|
||||
IControlAppearance UnfocusedAppearance { get; };
|
||||
Boolean HasUnfocusedAppearance();
|
||||
|
||||
UInt64 SwapChainHandle { get; };
|
||||
|
||||
Windows.Foundation.Size FontSize { get; };
|
||||
String FontFaceName { get; };
|
||||
UInt16 FontWeight { get; };
|
||||
Double Opacity { get; };
|
||||
|
||||
Boolean TrySendKeyEvent(Int16 vkey,
|
||||
Int16 scanCode,
|
||||
|
@ -75,7 +82,6 @@ namespace Microsoft.Terminal.Control
|
|||
void BlinkAttributeTick();
|
||||
void UpdatePatternLocations();
|
||||
void Search(String text, Boolean goForward, Boolean caseSensitive);
|
||||
void SetBackgroundOpacity(Double opacity);
|
||||
Microsoft.Terminal.Core.Color BackgroundColor { get; };
|
||||
|
||||
Boolean HasSelection { get; };
|
||||
|
|
|
@ -39,13 +39,14 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
}
|
||||
|
||||
ControlInteractivity::ControlInteractivity(IControlSettings settings,
|
||||
Control::IControlAppearance unfocusedAppearance,
|
||||
TerminalConnection::ITerminalConnection connection) :
|
||||
_touchAnchor{ std::nullopt },
|
||||
_lastMouseClickTimestamp{},
|
||||
_lastMouseClickPos{},
|
||||
_selectionNeedsToBeCopied{ false }
|
||||
{
|
||||
_core = winrt::make_self<ControlCore>(settings, connection);
|
||||
_core = winrt::make_self<ControlCore>(settings, unfocusedAppearance, connection);
|
||||
}
|
||||
|
||||
// Method Description:
|
||||
|
@ -641,4 +642,15 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
return _core->GetUiaData();
|
||||
}
|
||||
|
||||
// Method Description:
|
||||
// - Used by the TermControl to know if it should translate drag-dropped
|
||||
// paths into WSL-friendly paths.
|
||||
// Arguments:
|
||||
// - <none>
|
||||
// Return Value:
|
||||
// - true if the connection we were created with was a WSL profile.
|
||||
bool ControlInteractivity::ManglePathsForWsl()
|
||||
{
|
||||
return _core->Settings().ProfileSource() == L"Windows.Terminal.Wsl";
|
||||
}
|
||||
}
|
||||
|
|
|
@ -36,6 +36,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
{
|
||||
public:
|
||||
ControlInteractivity(IControlSettings settings,
|
||||
Control::IControlAppearance unfocusedAppearance,
|
||||
TerminalConnection::ITerminalConnection connection);
|
||||
|
||||
void GotFocus();
|
||||
|
@ -83,6 +84,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
const Windows::Foundation::IReference<CopyFormat>& formats);
|
||||
void RequestPasteTextFromClipboard();
|
||||
void SetEndSelectionPoint(const til::point pixelPosition);
|
||||
bool ManglePathsForWsl();
|
||||
|
||||
TYPED_EVENT(OpenHyperlink, IInspectable, Control::OpenHyperlinkEventArgs);
|
||||
TYPED_EVENT(PasteFromClipboard, IInspectable, Control::PasteFromClipboardEventArgs);
|
||||
|
|
|
@ -14,6 +14,7 @@ namespace Microsoft.Terminal.Control
|
|||
[default_interface] runtimeclass ControlInteractivity
|
||||
{
|
||||
ControlInteractivity(IControlSettings settings,
|
||||
IControlAppearance unfocusedAppearance,
|
||||
Microsoft.Terminal.TerminalConnection.ITerminalConnection connection);
|
||||
|
||||
ControlCore Core { get; };
|
||||
|
@ -58,6 +59,8 @@ namespace Microsoft.Terminal.Control
|
|||
|
||||
void UpdateScrollbar(Double newValue);
|
||||
|
||||
Boolean ManglePathsForWsl { get; };
|
||||
|
||||
event Windows.Foundation.TypedEventHandler<Object, OpenHyperlinkEventArgs> OpenHyperlink;
|
||||
event Windows.Foundation.TypedEventHandler<Object, ScrollPositionChangedArgs> ScrollPositionChanged;
|
||||
event Windows.Foundation.TypedEventHandler<Object, PasteFromClipboardEventArgs> PasteFromClipboard;
|
||||
|
|
81
src/cascadia/TerminalControl/ControlSettings.h
Normal file
81
src/cascadia/TerminalControl/ControlSettings.h
Normal file
|
@ -0,0 +1,81 @@
|
|||
/*++
|
||||
Copyright (c) Microsoft Corporation
|
||||
Licensed under the MIT license.
|
||||
--*/
|
||||
#pragma once
|
||||
#include "../../inc/cppwinrt_utils.h"
|
||||
#include "../../inc/ControlProperties.h"
|
||||
|
||||
#include <DefaultSettings.h>
|
||||
#include <conattrs.hpp>
|
||||
#include "ControlAppearance.h"
|
||||
|
||||
using IFontFeatureMap = winrt::Windows::Foundation::Collections::IMap<winrt::hstring, uint32_t>;
|
||||
using IFontAxesMap = winrt::Windows::Foundation::Collections::IMap<winrt::hstring, float>;
|
||||
|
||||
namespace winrt::Microsoft::Terminal::Control::implementation
|
||||
{
|
||||
struct ControlSettings : public winrt::implements<ControlSettings, Microsoft::Terminal::Control::IControlSettings, Microsoft::Terminal::Control::IControlAppearance, Microsoft::Terminal::Core::ICoreSettings, Microsoft::Terminal::Core::ICoreAppearance>
|
||||
{
|
||||
// Getters and setters for each *Setting member. We're not using
|
||||
// WINRT_PROPERTY for these, because they actually exist inside the
|
||||
// _focusedAppearance member. We don't need to reserve another member to
|
||||
// hold them.
|
||||
#define SETTINGS_GEN(type, name, ...) WINRT_PROPERTY(type, name, __VA_ARGS__);
|
||||
CORE_SETTINGS(SETTINGS_GEN)
|
||||
CONTROL_SETTINGS(SETTINGS_GEN)
|
||||
#undef SETTINGS_GEN
|
||||
|
||||
private:
|
||||
winrt::com_ptr<ControlAppearance> _unfocusedAppearance{ nullptr };
|
||||
winrt::com_ptr<ControlAppearance> _focusedAppearance{ nullptr };
|
||||
bool _hasUnfocusedAppearance{ false };
|
||||
|
||||
public:
|
||||
ControlSettings(const Control::IControlSettings& settings,
|
||||
const Control::IControlAppearance& unfocusedAppearance)
|
||||
{
|
||||
_hasUnfocusedAppearance = unfocusedAppearance != nullptr;
|
||||
|
||||
_focusedAppearance = winrt::make_self<implementation::ControlAppearance>(settings);
|
||||
_unfocusedAppearance = unfocusedAppearance ?
|
||||
winrt::make_self<implementation::ControlAppearance>(unfocusedAppearance) :
|
||||
_focusedAppearance;
|
||||
|
||||
// Copy every value from the passed in settings, into us.
|
||||
#define COPY_SETTING(type, name, ...) _##name = settings.name();
|
||||
CORE_SETTINGS(COPY_SETTING)
|
||||
CONTROL_SETTINGS(COPY_SETTING)
|
||||
#undef COPY_SETTING
|
||||
}
|
||||
|
||||
winrt::com_ptr<ControlAppearance> UnfocusedAppearance() { return _unfocusedAppearance; }
|
||||
winrt::com_ptr<ControlAppearance> FocusedAppearance() { return _focusedAppearance; }
|
||||
bool HasUnfocusedAppearance() { return _hasUnfocusedAppearance; }
|
||||
|
||||
// Getters and setters for each Appearance member. We're not using
|
||||
// WINRT_PROPERTY for these, because they actually exist inside the
|
||||
// _focusedAppearance member. We don't need to reserve another member to
|
||||
// hold them.
|
||||
//
|
||||
// The Appearance members (including GetColorTableEntry below) are used
|
||||
// when this ControlSettings is cast to a IControlAppearance or
|
||||
// ICoreAppearance. In those cases, we'll always return the Focused
|
||||
// appearance's version of the member. Callers who care about which
|
||||
// appearance is being used should be more careful. Fortunately, this
|
||||
// situation is generally only used when a control is first created, or
|
||||
// when calling UpdateSettings.
|
||||
#define APPEARANCE_GEN(type, name, ...) \
|
||||
type name() const noexcept { return _focusedAppearance->name(); } \
|
||||
void name(const type& value) noexcept { _focusedAppearance->name(value); }
|
||||
|
||||
CORE_APPEARANCE_SETTINGS(APPEARANCE_GEN)
|
||||
CONTROL_APPEARANCE_SETTINGS(APPEARANCE_GEN)
|
||||
#undef APPEARANCE_GEN
|
||||
|
||||
winrt::Microsoft::Terminal::Core::Color GetColorTableEntry(int32_t index) noexcept
|
||||
{
|
||||
return _focusedAppearance->GetColorTableEntry(index);
|
||||
}
|
||||
};
|
||||
}
|
|
@ -5,18 +5,18 @@ namespace Microsoft.Terminal.Control
|
|||
{
|
||||
interface IControlAppearance requires Microsoft.Terminal.Core.ICoreAppearance
|
||||
{
|
||||
Microsoft.Terminal.Core.Color SelectionBackground;
|
||||
String BackgroundImage;
|
||||
Double BackgroundImageOpacity;
|
||||
Windows.UI.Xaml.Media.Stretch BackgroundImageStretchMode;
|
||||
Windows.UI.Xaml.HorizontalAlignment BackgroundImageHorizontalAlignment;
|
||||
Windows.UI.Xaml.VerticalAlignment BackgroundImageVerticalAlignment;
|
||||
Boolean IntenseIsBold;
|
||||
Microsoft.Terminal.Core.Color SelectionBackground { get; };
|
||||
String BackgroundImage { get; };
|
||||
Double BackgroundImageOpacity { get; };
|
||||
Windows.UI.Xaml.Media.Stretch BackgroundImageStretchMode { get; };
|
||||
Windows.UI.Xaml.HorizontalAlignment BackgroundImageHorizontalAlignment { get; };
|
||||
Windows.UI.Xaml.VerticalAlignment BackgroundImageVerticalAlignment { get; };
|
||||
Boolean IntenseIsBold { get; };
|
||||
// IntenseIsBright is in Core Appearance
|
||||
Double Opacity;
|
||||
Double Opacity { get; };
|
||||
|
||||
// Experimental settings
|
||||
Boolean RetroTerminalEffect;
|
||||
String PixelShaderPath;
|
||||
Boolean RetroTerminalEffect { get; };
|
||||
String PixelShaderPath { get; };
|
||||
};
|
||||
}
|
||||
|
|
|
@ -24,34 +24,37 @@ namespace Microsoft.Terminal.Control
|
|||
// TermControl's behavior. In these settings there is both the entirety
|
||||
// of the Core ITerminalSettings interface, and any additional settings
|
||||
// for specifically the control.
|
||||
interface IControlSettings requires Microsoft.Terminal.Core.ICoreSettings, Microsoft.Terminal.Control.IControlAppearance
|
||||
interface IControlSettings requires Microsoft.Terminal.Core.ICoreSettings,
|
||||
Microsoft.Terminal.Control.IControlAppearance
|
||||
{
|
||||
String ProfileName;
|
||||
String ProfileSource;
|
||||
|
||||
Boolean UseAcrylic;
|
||||
ScrollbarState ScrollState;
|
||||
Boolean UseAtlasEngine;
|
||||
String FontFace;
|
||||
Int32 FontSize;
|
||||
Windows.UI.Text.FontWeight FontWeight;
|
||||
String Padding;
|
||||
Windows.Foundation.Collections.IMap<String, UInt32> FontFeatures;
|
||||
Windows.Foundation.Collections.IMap<String, Single> FontAxes;
|
||||
Boolean UseAcrylic { get; };
|
||||
ScrollbarState ScrollState { get; };
|
||||
|
||||
Microsoft.Terminal.Control.IKeyBindings KeyBindings;
|
||||
Boolean UseAtlasEngine { get; };
|
||||
|
||||
Boolean CopyOnSelect;
|
||||
Boolean FocusFollowMouse;
|
||||
String FontFace { get; };
|
||||
Int32 FontSize { get; };
|
||||
Windows.UI.Text.FontWeight FontWeight { get; };
|
||||
String Padding { get; };
|
||||
Windows.Foundation.Collections.IMap<String, UInt32> FontFeatures { get; };
|
||||
Windows.Foundation.Collections.IMap<String, Single> FontAxes { get; };
|
||||
|
||||
String Commandline;
|
||||
String StartingDirectory;
|
||||
String EnvironmentVariables;
|
||||
Microsoft.Terminal.Control.IKeyBindings KeyBindings { get; };
|
||||
|
||||
TextAntialiasingMode AntialiasingMode;
|
||||
Boolean CopyOnSelect { get; };
|
||||
Boolean FocusFollowMouse { get; };
|
||||
|
||||
String Commandline { get; };
|
||||
String StartingDirectory { get; };
|
||||
String EnvironmentVariables { get; };
|
||||
|
||||
TextAntialiasingMode AntialiasingMode { get; };
|
||||
|
||||
// Experimental Settings
|
||||
Boolean ForceFullRepaintRendering;
|
||||
Boolean SoftwareRendering;
|
||||
Boolean ForceFullRepaintRendering { get; };
|
||||
Boolean SoftwareRendering { get; };
|
||||
};
|
||||
}
|
||||
|
|
|
@ -22,5 +22,7 @@ namespace Microsoft.Terminal.Control
|
|||
Boolean BracketedPasteEnabled { get; };
|
||||
|
||||
Microsoft.Terminal.TerminalConnection.ConnectionState ConnectionState { get; };
|
||||
|
||||
Microsoft.Terminal.Core.Scheme ColorScheme { get; set; };
|
||||
};
|
||||
}
|
||||
|
|
|
@ -48,8 +48,8 @@ DEFINE_ENUM_FLAG_OPERATORS(winrt::Microsoft::Terminal::Control::MouseButtonState
|
|||
namespace winrt::Microsoft::Terminal::Control::implementation
|
||||
{
|
||||
TermControl::TermControl(IControlSettings settings,
|
||||
Control::IControlAppearance unfocusedAppearance,
|
||||
TerminalConnection::ITerminalConnection connection) :
|
||||
_settings{ settings },
|
||||
_isInternalScrollBarUpdate{ false },
|
||||
_autoScrollVelocity{ 0 },
|
||||
_autoScrollingPointerPoint{ std::nullopt },
|
||||
|
@ -61,7 +61,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
{
|
||||
InitializeComponent();
|
||||
|
||||
_interactivity = winrt::make<implementation::ControlInteractivity>(settings, connection);
|
||||
_interactivity = winrt::make<implementation::ControlInteractivity>(settings, unfocusedAppearance, connection);
|
||||
_core = _interactivity.Core();
|
||||
|
||||
// These events might all be triggered by the connection, but that
|
||||
|
@ -77,7 +77,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
// These callbacks can only really be triggered by UI interactions. So
|
||||
// they don't need weak refs - they can't be triggered unless we're
|
||||
// alive.
|
||||
_core.BackgroundColorChanged({ this, &TermControl::_BackgroundColorChangedHandler });
|
||||
_core.BackgroundColorChanged({ this, &TermControl::_coreBackgroundColorChanged });
|
||||
_core.FontSizeChanged({ this, &TermControl::_coreFontSizeChanged });
|
||||
_core.TransparencyChanged({ this, &TermControl::_coreTransparencyChanged });
|
||||
_core.RaiseNotice({ this, &TermControl::_coreRaisedNotice });
|
||||
|
@ -144,7 +144,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
_autoScrollTimer.Interval(AutoScrollUpdateInterval);
|
||||
_autoScrollTimer.Tick({ this, &TermControl::_UpdateAutoScroll });
|
||||
|
||||
_ApplyUISettings(_settings);
|
||||
_ApplyUISettings();
|
||||
}
|
||||
|
||||
// Method Description:
|
||||
|
@ -229,11 +229,15 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
this->Focus(FocusState::Programmatic);
|
||||
}
|
||||
|
||||
winrt::fire_and_forget TermControl::UpdateControlSettings(IControlSettings settings)
|
||||
{
|
||||
return UpdateControlSettings(settings, _core.UnfocusedAppearance());
|
||||
}
|
||||
// Method Description:
|
||||
// - Given Settings having been updated, applies the settings to the current terminal.
|
||||
// Return Value:
|
||||
// - <none>
|
||||
winrt::fire_and_forget TermControl::UpdateSettings()
|
||||
winrt::fire_and_forget TermControl::UpdateControlSettings(IControlSettings settings, IControlAppearance unfocusedAppearance)
|
||||
{
|
||||
auto weakThis{ get_weak() };
|
||||
|
||||
|
@ -241,21 +245,18 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
// terminal.
|
||||
co_await winrt::resume_foreground(Dispatcher());
|
||||
|
||||
_UpdateSettingsFromUIThread(_settings);
|
||||
_core.UpdateSettings(settings, unfocusedAppearance);
|
||||
|
||||
auto appearance = _settings.try_as<IControlAppearance>();
|
||||
if (!_focused && _UnfocusedAppearance)
|
||||
{
|
||||
appearance = _UnfocusedAppearance;
|
||||
}
|
||||
_UpdateAppearanceFromUIThread(appearance);
|
||||
_UpdateSettingsFromUIThread();
|
||||
|
||||
_UpdateAppearanceFromUIThread(_focused ? _core.FocusedAppearance() : _core.UnfocusedAppearance());
|
||||
}
|
||||
|
||||
// Method Description:
|
||||
// - Dispatches a call to the UI thread and updates the appearance
|
||||
// Arguments:
|
||||
// - newAppearance: the new appearance to set
|
||||
winrt::fire_and_forget TermControl::UpdateAppearance(const IControlAppearance newAppearance)
|
||||
winrt::fire_and_forget TermControl::UpdateAppearance(IControlAppearance newAppearance)
|
||||
{
|
||||
// Dispatch a call to the UI thread
|
||||
co_await winrt::resume_foreground(Dispatcher());
|
||||
|
@ -271,17 +272,15 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
// - INVARIANT: This method must be called from the UI thread.
|
||||
// Arguments:
|
||||
// - newSettings: the new settings to set
|
||||
void TermControl::_UpdateSettingsFromUIThread(IControlSettings newSettings)
|
||||
void TermControl::_UpdateSettingsFromUIThread()
|
||||
{
|
||||
if (_IsClosing())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_core.UpdateSettings(_settings);
|
||||
|
||||
// Update our control settings
|
||||
_ApplyUISettings(_settings);
|
||||
_ApplyUISettings();
|
||||
}
|
||||
|
||||
// Method Description:
|
||||
|
@ -289,7 +288,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
// - INVARIANT: This method must be called from the UI thread.
|
||||
// Arguments:
|
||||
// - newAppearance: the new appearance to set
|
||||
void TermControl::_UpdateAppearanceFromUIThread(IControlAppearance newAppearance)
|
||||
void TermControl::_UpdateAppearanceFromUIThread(Control::IControlAppearance newAppearance)
|
||||
{
|
||||
if (_IsClosing())
|
||||
{
|
||||
|
@ -300,6 +299,10 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
|
||||
// Update our control settings
|
||||
const auto bg = newAppearance.DefaultBackground();
|
||||
|
||||
// In the future, this might need to be changed to a
|
||||
// _InitializeBackgroundBrush call instead, because we may need to
|
||||
// switch from a solid color brush to an acrylic one.
|
||||
_changeBackgroundColor(bg);
|
||||
|
||||
// Set TSF Foreground
|
||||
|
@ -307,7 +310,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
foregroundBrush.Color(static_cast<til::color>(newAppearance.DefaultForeground()));
|
||||
TSFInputControl().Foreground(foregroundBrush);
|
||||
|
||||
_core.UpdateAppearance(newAppearance);
|
||||
_core.ApplyAppearance(_focused);
|
||||
}
|
||||
|
||||
// Method Description:
|
||||
|
@ -331,7 +334,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
}
|
||||
|
||||
// Method Description:
|
||||
// - Style our UI elements based on the values in our _settings, and set up
|
||||
// - Style our UI elements based on the values in our settings, and set up
|
||||
// other control-specific settings. This method will be called whenever
|
||||
// the settings are reloaded.
|
||||
// * Calls _InitializeBackgroundBrush to set up the Xaml brush responsible
|
||||
|
@ -342,21 +345,21 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
// - <none>
|
||||
// Return Value:
|
||||
// - <none>
|
||||
void TermControl::_ApplyUISettings(const IControlSettings& newSettings)
|
||||
void TermControl::_ApplyUISettings()
|
||||
{
|
||||
_InitializeBackgroundBrush();
|
||||
|
||||
const auto bg = newSettings.DefaultBackground();
|
||||
_changeBackgroundColor(bg);
|
||||
// settings might be out-of-proc in the future
|
||||
auto settings{ _core.Settings() };
|
||||
|
||||
// Apply padding as swapChainPanel's margin
|
||||
const auto newMargin = ParseThicknessFromPadding(newSettings.Padding());
|
||||
const auto newMargin = ParseThicknessFromPadding(settings.Padding());
|
||||
SwapChainPanel().Margin(newMargin);
|
||||
|
||||
TSFInputControl().Margin(newMargin);
|
||||
|
||||
// Apply settings for scrollbar
|
||||
if (newSettings.ScrollState() == ScrollbarState::Hidden)
|
||||
if (settings.ScrollState() == ScrollbarState::Hidden)
|
||||
{
|
||||
// In the scenario where the user has turned off the OS setting to automatically hide scrollbars, the
|
||||
// Terminal scrollbar would still be visible; so, we need to set the control's visibility accordingly to
|
||||
|
@ -440,16 +443,15 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
// use bgcolor as acrylic's tint
|
||||
// - Avoids image flickering and acrylic brush redraw if settings are changed
|
||||
// but the appropriate brush is still in place.
|
||||
// - Does not apply background color outside of acrylic mode;
|
||||
// _BackgroundColorChanged must be called to do so.
|
||||
// Arguments:
|
||||
// - <none>
|
||||
// Return Value:
|
||||
// - <none>
|
||||
void TermControl::_InitializeBackgroundBrush()
|
||||
{
|
||||
auto appearance = _settings.try_as<IControlAppearance>();
|
||||
if (_settings.UseAcrylic())
|
||||
auto settings{ _core.Settings() };
|
||||
auto bgColor = til::color{ _core.FocusedAppearance().DefaultBackground() }.with_alpha(0xff);
|
||||
if (settings.UseAcrylic())
|
||||
{
|
||||
// See if we've already got an acrylic background brush
|
||||
// to avoid the flicker when setting up a new one
|
||||
|
@ -464,65 +466,83 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
|
||||
// see GH#1082: Initialize background color so we don't get a
|
||||
// fade/flash when _BackgroundColorChanged is called
|
||||
auto bgColor = til::color{ _settings.DefaultBackground() }.with_alpha(0xff);
|
||||
|
||||
acrylic.FallbackColor(bgColor);
|
||||
acrylic.TintColor(bgColor);
|
||||
|
||||
// Apply brush settings
|
||||
acrylic.TintOpacity(appearance.Opacity());
|
||||
acrylic.TintOpacity(_core.Opacity());
|
||||
|
||||
// Apply brush to control if it's not already there
|
||||
if (RootGrid().Background() != acrylic)
|
||||
{
|
||||
RootGrid().Background(acrylic);
|
||||
}
|
||||
|
||||
// GH#5098: Inform the engine of the new opacity of the default text background.
|
||||
_core.SetBackgroundOpacity(appearance.Opacity());
|
||||
}
|
||||
else
|
||||
{
|
||||
Media::SolidColorBrush solidColor{};
|
||||
solidColor.Opacity(_settings.Opacity());
|
||||
RootGrid().Background(solidColor);
|
||||
solidColor.Opacity(_core.Opacity());
|
||||
solidColor.Color(bgColor);
|
||||
|
||||
// GH#5098: Inform the engine of the new opacity of the default text background.
|
||||
_core.SetBackgroundOpacity(appearance.Opacity());
|
||||
RootGrid().Background(solidColor);
|
||||
}
|
||||
}
|
||||
|
||||
// Method Description:
|
||||
// - Style the background of the control with the provided background color
|
||||
// - Handler for the core's BackgroundColorChanged event. Updates the color
|
||||
// of our background brush to match.
|
||||
// - Hops over to the UI thread to do this work.
|
||||
// Arguments:
|
||||
// - color: The background color to use as a uint32 (aka DWORD COLORREF)
|
||||
// <unused>
|
||||
// Return Value:
|
||||
// - <none>
|
||||
void TermControl::_BackgroundColorChangedHandler(const IInspectable& /*sender*/,
|
||||
const IInspectable& /*args*/)
|
||||
{
|
||||
til::color newBgColor{ _core.BackgroundColor() };
|
||||
_changeBackgroundColor(newBgColor);
|
||||
}
|
||||
|
||||
winrt::fire_and_forget TermControl::_changeBackgroundColor(const til::color bg)
|
||||
winrt::fire_and_forget TermControl::_coreBackgroundColorChanged(const IInspectable& /*sender*/,
|
||||
const IInspectable& /*args*/)
|
||||
{
|
||||
auto weakThis{ get_weak() };
|
||||
co_await winrt::resume_foreground(Dispatcher());
|
||||
|
||||
if (auto control{ weakThis.get() })
|
||||
{
|
||||
if (auto acrylic = RootGrid().Background().try_as<Media::AcrylicBrush>())
|
||||
{
|
||||
acrylic.FallbackColor(bg);
|
||||
acrylic.TintColor(bg);
|
||||
}
|
||||
else if (auto solidColor = RootGrid().Background().try_as<Media::SolidColorBrush>())
|
||||
{
|
||||
const auto originalOpacity = solidColor.Opacity();
|
||||
solidColor.Color(bg);
|
||||
solidColor.Opacity(originalOpacity);
|
||||
}
|
||||
til::color newBgColor{ _core.BackgroundColor() };
|
||||
_changeBackgroundColor(newBgColor);
|
||||
}
|
||||
}
|
||||
|
||||
// Method Description:
|
||||
// - Update the color of the background brush we're using. This does _not_
|
||||
// update the opacity, or what type of brush it is.
|
||||
// - INVARIANT: This needs to be called on the UI thread.
|
||||
// Arguments:
|
||||
// - bg: the new color to use as the background color.
|
||||
void TermControl::_changeBackgroundColor(const til::color bg)
|
||||
{
|
||||
if (auto acrylic = RootGrid().Background().try_as<Media::AcrylicBrush>())
|
||||
{
|
||||
acrylic.FallbackColor(bg);
|
||||
acrylic.TintColor(bg);
|
||||
}
|
||||
else if (auto solidColor = RootGrid().Background().try_as<Media::SolidColorBrush>())
|
||||
{
|
||||
const auto originalOpacity = solidColor.Opacity();
|
||||
solidColor.Color(bg);
|
||||
solidColor.Opacity(originalOpacity);
|
||||
}
|
||||
}
|
||||
|
||||
// Method Description:
|
||||
// - Update the opacity of the background brush we're using. This does _not_
|
||||
// update the color, or what type of brush it is.
|
||||
// - INVARIANT: This needs to be called on the UI thread.
|
||||
void TermControl::_changeBackgroundOpacity()
|
||||
{
|
||||
const auto opacity{ _core.Opacity() };
|
||||
if (auto acrylic = RootGrid().Background().try_as<Media::AcrylicBrush>())
|
||||
{
|
||||
acrylic.TintOpacity(opacity);
|
||||
}
|
||||
else if (auto solidColor = RootGrid().Background().try_as<Media::SolidColorBrush>())
|
||||
{
|
||||
solidColor.Opacity(opacity);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -618,7 +638,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND) == hr)
|
||||
{
|
||||
message = { fmt::format(std::wstring_view{ RS_(L"PixelShaderNotFound") },
|
||||
_settings.PixelShaderPath()) };
|
||||
(_focused ? _core.FocusedAppearance() : _core.UnfocusedAppearance()).PixelShaderPath()) };
|
||||
}
|
||||
else if (D2DERR_SHADER_COMPILE_FAILED == hr)
|
||||
{
|
||||
|
@ -740,7 +760,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
}
|
||||
|
||||
// Now that the renderer is set up, update the appearance for initialization
|
||||
_UpdateAppearanceFromUIThread(_settings);
|
||||
_UpdateAppearanceFromUIThread(_core.FocusedAppearance());
|
||||
|
||||
_initializedTerminal = true;
|
||||
|
||||
|
@ -773,15 +793,12 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
_HidePointerCursorHandlers(*this, nullptr);
|
||||
|
||||
const auto ch = e.Character();
|
||||
const auto keyStatus = e.KeyStatus();
|
||||
const auto scanCode = gsl::narrow_cast<WORD>(keyStatus.ScanCode);
|
||||
const auto scanCode = gsl::narrow_cast<WORD>(e.KeyStatus().ScanCode);
|
||||
auto modifiers = _GetPressedModifierKeys();
|
||||
|
||||
if (keyStatus.IsExtendedKey)
|
||||
if (e.KeyStatus().IsExtendedKey)
|
||||
{
|
||||
modifiers |= ControlKeyStates::EnhancedKey;
|
||||
}
|
||||
|
||||
const bool handled = _core.SendCharEvent(ch, scanCode, modifiers);
|
||||
e.Handled(handled);
|
||||
}
|
||||
|
@ -815,7 +832,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
// This is required as part of GH#638.
|
||||
// Or do so for alt+space; only send to terminal when explicitly unbound
|
||||
// That is part of #GH7125
|
||||
auto bindings{ _settings.KeyBindings() };
|
||||
auto bindings{ _core.Settings().KeyBindings() };
|
||||
bool isUnbound = false;
|
||||
const KeyChord kc = {
|
||||
modifiers.IsCtrlPressed(),
|
||||
|
@ -876,11 +893,6 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
const auto scanCode = gsl::narrow_cast<WORD>(keyStatus.ScanCode);
|
||||
auto modifiers = _GetPressedModifierKeys();
|
||||
|
||||
if (keyStatus.IsExtendedKey)
|
||||
{
|
||||
modifiers |= ControlKeyStates::EnhancedKey;
|
||||
}
|
||||
|
||||
// GH#11076:
|
||||
// For some weird reason we sometimes receive a WM_KEYDOWN
|
||||
// message without vkey or scanCode if a user drags a tab.
|
||||
|
@ -914,6 +926,11 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
return;
|
||||
}
|
||||
|
||||
if (keyStatus.IsExtendedKey)
|
||||
{
|
||||
modifiers |= ControlKeyStates::EnhancedKey;
|
||||
}
|
||||
|
||||
// Alt-Numpad# input will send us a character once the user releases
|
||||
// Alt, so we should be ignoring the individual keydowns. The character
|
||||
// will be sent through the TSFInputControl. See GH#1401 for more
|
||||
|
@ -960,7 +977,13 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
// - modifiers: The ControlKeyStates representing the modifier key states.
|
||||
bool TermControl::_TryHandleKeyBinding(const WORD vkey, const WORD scanCode, ::Microsoft::Terminal::Core::ControlKeyStates modifiers) const
|
||||
{
|
||||
auto bindings = _settings.KeyBindings();
|
||||
// TODO: GH#5000
|
||||
// The Core owning the keybindings is weird. That's for sure. In the
|
||||
// future, we may want to pass the keybindings into the control
|
||||
// separately, so the control can have a pointer to an in-proc
|
||||
// Keybindings object, rather than routing through the ControlCore.
|
||||
// (see GH#5000)
|
||||
auto bindings = _core.Settings().KeyBindings();
|
||||
if (!bindings)
|
||||
{
|
||||
return false;
|
||||
|
@ -991,7 +1014,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
// Arguments:
|
||||
// - vkey: The vkey of the key pressed.
|
||||
// - scanCode: The scan code of the key pressed.
|
||||
void TermControl::_ClearKeyboardState(const WORD vkey, const WORD scanCode) noexcept
|
||||
void TermControl::_ClearKeyboardState(const WORD vkey, const WORD scanCode) const noexcept
|
||||
{
|
||||
std::array<BYTE, 256> keyState;
|
||||
if (!GetKeyboardState(keyState.data()))
|
||||
|
@ -1139,7 +1162,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
const auto pixelPosition = _toTerminalOrigin(cursorPosition);
|
||||
const auto type = ptr.PointerDeviceType();
|
||||
|
||||
if (!_focused && _settings.FocusFollowMouse())
|
||||
if (!_focused && _core.Settings().FocusFollowMouse())
|
||||
{
|
||||
_FocusFollowMouseRequestedHandlers(*this, nullptr);
|
||||
}
|
||||
|
@ -1307,7 +1330,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
// - Called in response to the core's TransparencyChanged event. We'll use
|
||||
// this to update our background brush.
|
||||
// - The Core should have already updated the TintOpacity and UseAcrylic
|
||||
// properties in the _settings.
|
||||
// properties in the _settings->
|
||||
// Arguments:
|
||||
// - <unused>
|
||||
// Return Value:
|
||||
|
@ -1318,9 +1341,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
co_await resume_foreground(Dispatcher());
|
||||
try
|
||||
{
|
||||
_InitializeBackgroundBrush();
|
||||
const auto bg = _settings.DefaultBackground();
|
||||
_changeBackgroundColor(bg);
|
||||
_changeBackgroundOpacity();
|
||||
}
|
||||
CATCH_LOG();
|
||||
}
|
||||
|
@ -1527,12 +1548,13 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
_blinkTimer->Start();
|
||||
}
|
||||
|
||||
// Only update the appearance here if an unfocused config exists -
|
||||
// if an unfocused config does not exist then we never would have switched
|
||||
// appearances anyway so there's no need to switch back upon gaining focus
|
||||
if (_UnfocusedAppearance)
|
||||
// Only update the appearance here if an unfocused config exists - if an
|
||||
// unfocused config does not exist then we never would have switched
|
||||
// appearances anyway so there's no need to switch back upon gaining
|
||||
// focus
|
||||
if (_core.HasUnfocusedAppearance())
|
||||
{
|
||||
UpdateAppearance(_settings);
|
||||
UpdateAppearance(_core.FocusedAppearance());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1574,9 +1596,9 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
|
||||
// Check if there is an unfocused config we should set the appearance to
|
||||
// upon losing focus
|
||||
if (_UnfocusedAppearance)
|
||||
if (_core.HasUnfocusedAppearance())
|
||||
{
|
||||
UpdateAppearance(_UnfocusedAppearance);
|
||||
UpdateAppearance(_core.UnfocusedAppearance());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1725,7 +1747,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
|
||||
hstring TermControl::GetProfileName() const
|
||||
{
|
||||
return _settings.ProfileName();
|
||||
return _core.Settings().ProfileName();
|
||||
}
|
||||
|
||||
hstring TermControl::WorkingDirectory() const
|
||||
|
@ -1947,7 +1969,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
double width = fontSize.Width;
|
||||
double height = fontSize.Height;
|
||||
// Reserve additional space if scrollbar is intended to be visible
|
||||
if (_settings.ScrollState() == ScrollbarState::Visible)
|
||||
if (_core.Settings().ScrollState() == ScrollbarState::Visible)
|
||||
{
|
||||
width += ScrollBar().ActualWidth();
|
||||
}
|
||||
|
@ -1968,7 +1990,8 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
const winrt::Windows::Foundation::Size minSize{ 1, 1 };
|
||||
const double scaleFactor = DisplayInformation::GetForCurrentView().RawPixelsPerViewPixel();
|
||||
const auto dpi = ::base::saturated_cast<uint32_t>(USER_DEFAULT_SCREEN_DPI * scaleFactor);
|
||||
return GetProposedDimensions(_settings, dpi, minSize);
|
||||
|
||||
return GetProposedDimensions(_core.Settings(), dpi, minSize);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1990,7 +2013,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
padding.Left + padding.Right :
|
||||
padding.Top + padding.Bottom);
|
||||
|
||||
if (widthOrHeight && _settings.ScrollState() == ScrollbarState::Visible)
|
||||
if (widthOrHeight && _core.Settings().ScrollState() == ScrollbarState::Visible)
|
||||
{
|
||||
nonTerminalArea += gsl::narrow_cast<float>(ScrollBar().ActualWidth());
|
||||
}
|
||||
|
@ -2063,7 +2086,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
// don't necessarily include that state.
|
||||
// Return Value:
|
||||
// - The Microsoft::Terminal::Core::ControlKeyStates representing the modifier key states.
|
||||
ControlKeyStates TermControl::_GetPressedModifierKeys() noexcept
|
||||
ControlKeyStates TermControl::_GetPressedModifierKeys() const
|
||||
{
|
||||
const CoreWindow window = CoreWindow::GetForCurrentThread();
|
||||
// DONT USE
|
||||
|
@ -2273,7 +2296,16 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
std::wstring fullPath{ item.Path() };
|
||||
|
||||
// Fix path for WSL
|
||||
if (_settings.ProfileSource() == L"Windows.Terminal.Wsl")
|
||||
// In the fullness of time, we should likely plumb this up
|
||||
// to the TerminalApp layer, and have it make the decision
|
||||
// if this control should have it's path mangled (and do the
|
||||
// mangling), rather than exposing the source concept to the
|
||||
// Control layer.
|
||||
//
|
||||
// However, it's likely that the control layer may need to
|
||||
// know about the source anyways in the future, to support
|
||||
// GH#3158
|
||||
if (_interactivity.ManglePathsForWsl())
|
||||
{
|
||||
std::replace(fullPath.begin(), fullPath.end(), L'\\', L'/');
|
||||
|
||||
|
@ -2420,12 +2452,19 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
|
||||
IControlSettings TermControl::Settings() const
|
||||
{
|
||||
return _settings;
|
||||
}
|
||||
|
||||
void TermControl::Settings(IControlSettings newSettings)
|
||||
{
|
||||
_settings = newSettings;
|
||||
// TODO: GH#5000
|
||||
// We still need this in a couple places:
|
||||
// - Pane.cpp uses this for parsing out the StartingTitle, Commandline,
|
||||
// etc for Pane::GetTerminalArgsForPane.
|
||||
// - TerminalTab::_CreateToolTipTitle uses the ProfileName for the
|
||||
// tooltip for the tab.
|
||||
//
|
||||
// These both happen on the UI thread right now. In the future, when we
|
||||
// have to hop across the process boundary to get at the core settings,
|
||||
// it may make sense to cache these values inside the TermControl
|
||||
// itself, so it can do the hop once when it's first setup, rather than
|
||||
// when it's needed by the UI thread.
|
||||
return _core.Settings();
|
||||
}
|
||||
|
||||
Windows::Foundation::IReference<winrt::Windows::UI::Color> TermControl::TabColor() noexcept
|
||||
|
@ -2648,4 +2687,14 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
{
|
||||
return _core.ReadEntireBuffer();
|
||||
}
|
||||
|
||||
Core::Scheme TermControl::ColorScheme() const noexcept
|
||||
{
|
||||
return _core.ColorScheme();
|
||||
}
|
||||
|
||||
void TermControl::ColorScheme(const Core::Scheme& scheme) const noexcept
|
||||
{
|
||||
_core.ColorScheme(scheme);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -25,10 +25,13 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
{
|
||||
struct TermControl : TermControlT<TermControl>
|
||||
{
|
||||
TermControl(IControlSettings settings, TerminalConnection::ITerminalConnection connection);
|
||||
TermControl(IControlSettings settings,
|
||||
Control::IControlAppearance unfocusedAppearance,
|
||||
TerminalConnection::ITerminalConnection connection);
|
||||
|
||||
winrt::fire_and_forget UpdateSettings();
|
||||
winrt::fire_and_forget UpdateAppearance(const IControlAppearance newAppearance);
|
||||
winrt::fire_and_forget UpdateControlSettings(Control::IControlSettings settings);
|
||||
winrt::fire_and_forget UpdateControlSettings(Control::IControlSettings settings, Control::IControlAppearance unfocusedAppearance);
|
||||
IControlSettings Settings() const;
|
||||
|
||||
hstring GetProfileName() const;
|
||||
|
||||
|
@ -88,9 +91,6 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
Windows::UI::Xaml::Automation::Peers::AutomationPeer OnCreateAutomationPeer();
|
||||
const Windows::UI::Xaml::Thickness GetPadding();
|
||||
|
||||
IControlSettings Settings() const;
|
||||
void Settings(IControlSettings newSettings);
|
||||
|
||||
static Windows::Foundation::Size GetProposedDimensions(IControlSettings const& settings, const uint32_t dpi);
|
||||
static Windows::Foundation::Size GetProposedDimensions(IControlSettings const& settings, const uint32_t dpi, const winrt::Windows::Foundation::Size& initialSizeInChars);
|
||||
|
||||
|
@ -105,6 +105,9 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
|
||||
hstring ReadEntireBuffer() const;
|
||||
|
||||
winrt::Microsoft::Terminal::Core::Scheme ColorScheme() const noexcept;
|
||||
void ColorScheme(const winrt::Microsoft::Terminal::Core::Scheme& scheme) const noexcept;
|
||||
|
||||
// -------------------------------- WinRT Events ---------------------------------
|
||||
// clang-format off
|
||||
WINRT_CALLBACK(FontSizeChanged, Control::FontSizeChangedEventArgs);
|
||||
|
@ -127,8 +130,6 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
TYPED_EVENT(WarningBell, IInspectable, IInspectable);
|
||||
// clang-format on
|
||||
|
||||
WINRT_PROPERTY(IControlAppearance, UnfocusedAppearance);
|
||||
|
||||
private:
|
||||
friend struct TermControlT<TermControl>; // friend our parent so it can bind private event handlers
|
||||
|
||||
|
@ -146,7 +147,6 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
|
||||
winrt::com_ptr<SearchBoxControl> _searchBox;
|
||||
|
||||
IControlSettings _settings;
|
||||
bool _closing{ false };
|
||||
bool _focused{ false };
|
||||
bool _initializedTerminal{ false };
|
||||
|
@ -193,14 +193,16 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
return _closing;
|
||||
}
|
||||
|
||||
void _UpdateSettingsFromUIThread(IControlSettings newSettings);
|
||||
void _UpdateAppearanceFromUIThread(IControlAppearance newAppearance);
|
||||
void _ApplyUISettings(const IControlSettings&);
|
||||
void _UpdateSettingsFromUIThread();
|
||||
void _UpdateAppearanceFromUIThread(Control::IControlAppearance newAppearance);
|
||||
void _ApplyUISettings();
|
||||
winrt::fire_and_forget UpdateAppearance(Control::IControlAppearance newAppearance);
|
||||
void _SetBackgroundImage(const IControlAppearance& newAppearance);
|
||||
|
||||
void _InitializeBackgroundBrush();
|
||||
void _BackgroundColorChangedHandler(const IInspectable& sender, const IInspectable& args);
|
||||
winrt::fire_and_forget _changeBackgroundColor(const til::color bg);
|
||||
winrt::fire_and_forget _coreBackgroundColorChanged(const IInspectable& sender, const IInspectable& args);
|
||||
void _changeBackgroundColor(const til::color bg);
|
||||
void _changeBackgroundOpacity();
|
||||
|
||||
bool _InitializeTerminal();
|
||||
void _SetFontSize(int fontSize);
|
||||
|
@ -245,9 +247,9 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
|||
void _UpdateAutoScroll(Windows::Foundation::IInspectable const& sender, Windows::Foundation::IInspectable const& e);
|
||||
|
||||
void _KeyHandler(Windows::UI::Xaml::Input::KeyRoutedEventArgs const& e, const bool keyDown);
|
||||
static ::Microsoft::Terminal::Core::ControlKeyStates _GetPressedModifierKeys() noexcept;
|
||||
::Microsoft::Terminal::Core::ControlKeyStates _GetPressedModifierKeys() const;
|
||||
bool _TryHandleKeyBinding(const WORD vkey, const WORD scanCode, ::Microsoft::Terminal::Core::ControlKeyStates modifiers) const;
|
||||
static void _ClearKeyboardState(const WORD vkey, const WORD scanCode) noexcept;
|
||||
void _ClearKeyboardState(const WORD vkey, const WORD scanCode) const noexcept;
|
||||
bool _TrySendKeyEvent(const WORD vkey, const WORD scanCode, ::Microsoft::Terminal::Core::ControlKeyStates modifiers, const bool keyDown);
|
||||
|
||||
const til::point _toTerminalOrigin(winrt::Windows::Foundation::Point cursorPosition);
|
||||
|
|
|
@ -17,14 +17,15 @@ namespace Microsoft.Terminal.Control
|
|||
ICoreState
|
||||
{
|
||||
TermControl(IControlSettings settings,
|
||||
IControlAppearance unfocusedAppearance,
|
||||
Microsoft.Terminal.TerminalConnection.ITerminalConnection connection);
|
||||
|
||||
static Windows.Foundation.Size GetProposedDimensions(IControlSettings settings, UInt32 dpi);
|
||||
|
||||
void UpdateSettings();
|
||||
void UpdateControlSettings(IControlSettings settings);
|
||||
void UpdateControlSettings(IControlSettings settings, IControlAppearance unfocusedAppearance);
|
||||
|
||||
Microsoft.Terminal.Control.IControlSettings Settings;
|
||||
Microsoft.Terminal.Control.IControlAppearance UnfocusedAppearance;
|
||||
Microsoft.Terminal.Control.IControlSettings Settings { get; };
|
||||
|
||||
event FontSizeChangedEventArgs FontSizeChanged;
|
||||
event Windows.Foundation.TypedEventHandler<Object, TitleChangedEventArgs> TitleChanged;
|
||||
|
|
|
@ -50,6 +50,37 @@ namespace Microsoft.Terminal.Core
|
|||
UInt32 Value;
|
||||
};
|
||||
|
||||
struct Scheme
|
||||
{
|
||||
Microsoft.Terminal.Core.Color Foreground;
|
||||
Microsoft.Terminal.Core.Color Background;
|
||||
|
||||
Microsoft.Terminal.Core.Color SelectionBackground;
|
||||
|
||||
Microsoft.Terminal.Core.Color CursorColor;
|
||||
|
||||
// Table: A WinRT struct doesn't allow pointers (READ: doesn't allow
|
||||
// array members) in structs, but we very much would like this object to
|
||||
// be a struct. So we'll call out each color individually. There's only
|
||||
// 16, it's not that bad.
|
||||
Microsoft.Terminal.Core.Color Black;
|
||||
Microsoft.Terminal.Core.Color Red;
|
||||
Microsoft.Terminal.Core.Color Green;
|
||||
Microsoft.Terminal.Core.Color Yellow;
|
||||
Microsoft.Terminal.Core.Color Blue;
|
||||
Microsoft.Terminal.Core.Color Purple;
|
||||
Microsoft.Terminal.Core.Color Cyan;
|
||||
Microsoft.Terminal.Core.Color White;
|
||||
Microsoft.Terminal.Core.Color BrightBlack;
|
||||
Microsoft.Terminal.Core.Color BrightRed;
|
||||
Microsoft.Terminal.Core.Color BrightGreen;
|
||||
Microsoft.Terminal.Core.Color BrightYellow;
|
||||
Microsoft.Terminal.Core.Color BrightBlue;
|
||||
Microsoft.Terminal.Core.Color BrightPurple;
|
||||
Microsoft.Terminal.Core.Color BrightCyan;
|
||||
Microsoft.Terminal.Core.Color BrightWhite;
|
||||
};
|
||||
|
||||
declare
|
||||
{
|
||||
// Forward declare this parameterized specialization so that it lives
|
||||
|
|
|
@ -40,10 +40,13 @@ namespace Microsoft::Terminal::Core
|
|||
virtual bool WarningBell() noexcept = 0;
|
||||
virtual bool SetWindowTitle(std::wstring_view title) 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 SetColorTableEntry(const size_t tableIndex, const DWORD color) noexcept = 0;
|
||||
|
||||
virtual bool SetCursorStyle(const ::Microsoft::Console::VirtualTerminal::DispatchTypes::CursorStyle cursorStyle) noexcept = 0;
|
||||
virtual bool SetCursorColor(const DWORD color) noexcept = 0;
|
||||
|
||||
virtual bool SetDefaultForeground(const DWORD color) noexcept = 0;
|
||||
virtual bool SetDefaultBackground(const DWORD color) noexcept = 0;
|
||||
|
||||
virtual bool SetInputMode(const ::Microsoft::Console::VirtualTerminal::TerminalInput::Mode mode, const bool enabled) noexcept = 0;
|
||||
|
||||
|
|
|
@ -41,6 +41,8 @@ Terminal::Terminal() :
|
|||
_mutableViewport{ Viewport::Empty() },
|
||||
_title{},
|
||||
_colorTable{},
|
||||
_defaultFg{ RGB(255, 255, 255) },
|
||||
_defaultBg{ ARGB(0, 0, 0, 0) },
|
||||
_screenReversed{ false },
|
||||
_pfnWriteInput{ nullptr },
|
||||
_scrollOffset{ 0 },
|
||||
|
@ -59,14 +61,6 @@ Terminal::Terminal() :
|
|||
|
||||
_stateMachine = std::make_unique<StateMachine>(std::move(engine));
|
||||
|
||||
// Until we have a true pass-through mode (GH#1173), the decision as to
|
||||
// whether C1 controls are interpreted or not is made at the conhost level.
|
||||
// If they are being filtered out, then we will simply never receive them.
|
||||
// But if they are being accepted by conhost, there's a chance they may get
|
||||
// passed through in some situations, so it's important that our state
|
||||
// machine is always prepared to accept them.
|
||||
_stateMachine->SetParserMode(StateMachine::Mode::AcceptC1, true);
|
||||
|
||||
auto passAlongInput = [&](std::deque<std::unique_ptr<IInputEvent>>& inEventsToWrite) {
|
||||
if (!_pfnWriteInput)
|
||||
{
|
||||
|
@ -79,10 +73,6 @@ Terminal::Terminal() :
|
|||
_terminalInput = std::make_unique<TerminalInput>(passAlongInput);
|
||||
|
||||
_InitializeColorTable();
|
||||
|
||||
_colorTable.at(TextColor::DEFAULT_FOREGROUND) = RGB(255, 255, 255);
|
||||
_colorTable.at(TextColor::DEFAULT_BACKGROUND) = ARGB(0, 0, 0, 0);
|
||||
_colorTable.at(TextColor::CURSOR_COLOR) = INVALID_COLOR;
|
||||
}
|
||||
|
||||
void Terminal::Create(COORD viewportSize, SHORT scrollbackLines, IRenderTarget& renderTarget)
|
||||
|
@ -180,18 +170,15 @@ void Terminal::UpdateSettings(ICoreSettings settings)
|
|||
// - appearance: an ICoreAppearance with new settings values for us to use.
|
||||
void Terminal::UpdateAppearance(const ICoreAppearance& appearance)
|
||||
{
|
||||
// Set the default background as transparent to prevent the
|
||||
// DX layer from overwriting the background image or acrylic effect
|
||||
const til::color newBackgroundColor{ appearance.DefaultBackground() };
|
||||
_colorTable.at(TextColor::DEFAULT_BACKGROUND) = newBackgroundColor.with_alpha(0);
|
||||
const til::color newForegroundColor{ appearance.DefaultForeground() };
|
||||
_colorTable.at(TextColor::DEFAULT_FOREGROUND) = newForegroundColor;
|
||||
const til::color newCursorColor{ appearance.CursorColor() };
|
||||
_colorTable.at(TextColor::CURSOR_COLOR) = newCursorColor;
|
||||
|
||||
_intenseIsBright = appearance.IntenseIsBright();
|
||||
_adjustIndistinguishableColors = appearance.AdjustIndistinguishableColors();
|
||||
|
||||
// Set the default background as transparent to prevent the
|
||||
// DX layer from overwriting the background image or acrylic effect
|
||||
til::color newBackgroundColor{ appearance.DefaultBackground() };
|
||||
_defaultBg = newBackgroundColor.with_alpha(0);
|
||||
_defaultFg = appearance.DefaultForeground();
|
||||
|
||||
for (int i = 0; i < 16; i++)
|
||||
{
|
||||
_colorTable.at(i) = til::color{ appearance.GetColorTableEntry(i) };
|
||||
|
@ -227,7 +214,9 @@ void Terminal::UpdateAppearance(const ICoreAppearance& appearance)
|
|||
|
||||
if (_buffer)
|
||||
{
|
||||
_buffer->GetCursor().SetStyle(appearance.CursorHeight(), cursorShape);
|
||||
_buffer->GetCursor().SetStyle(appearance.CursorHeight(),
|
||||
til::color{ appearance.CursorColor() },
|
||||
cursorShape);
|
||||
}
|
||||
|
||||
_defaultCursorShape = cursorShape;
|
||||
|
@ -1302,3 +1291,67 @@ const size_t Microsoft::Terminal::Core::Terminal::GetTaskbarProgress() const noe
|
|||
{
|
||||
return _taskbarProgress;
|
||||
}
|
||||
|
||||
Scheme Terminal::GetColorScheme() const noexcept
|
||||
{
|
||||
Scheme s;
|
||||
|
||||
s.Foreground = til::color{ _defaultFg };
|
||||
// Don't leak the implementation detail that our _defaultBg is stored
|
||||
// internally without alpha.
|
||||
s.Background = til::color{ _defaultBg.with_alpha(0xff) };
|
||||
|
||||
// SelectionBackground is stored in the ControlAppearance
|
||||
s.CursorColor = til::color{ _buffer->GetCursor().GetColor() };
|
||||
|
||||
s.Black = til::color{ _colorTable[0] };
|
||||
s.Red = til::color{ _colorTable[1] };
|
||||
s.Green = til::color{ _colorTable[2] };
|
||||
s.Yellow = til::color{ _colorTable[3] };
|
||||
s.Blue = til::color{ _colorTable[4] };
|
||||
s.Purple = til::color{ _colorTable[5] };
|
||||
s.Cyan = til::color{ _colorTable[6] };
|
||||
s.White = til::color{ _colorTable[7] };
|
||||
s.BrightBlack = til::color{ _colorTable[8] };
|
||||
s.BrightRed = til::color{ _colorTable[9] };
|
||||
s.BrightGreen = til::color{ _colorTable[10] };
|
||||
s.BrightYellow = til::color{ _colorTable[11] };
|
||||
s.BrightBlue = til::color{ _colorTable[12] };
|
||||
s.BrightPurple = til::color{ _colorTable[13] };
|
||||
s.BrightCyan = til::color{ _colorTable[14] };
|
||||
s.BrightWhite = til::color{ _colorTable[15] };
|
||||
return s;
|
||||
}
|
||||
|
||||
void Terminal::ApplyScheme(const Scheme& colorScheme)
|
||||
{
|
||||
_defaultFg = colorScheme.Foreground;
|
||||
// Set the default background as transparent to prevent the
|
||||
// DX layer from overwriting the background image or acrylic effect
|
||||
til::color newBackgroundColor{ colorScheme.Background };
|
||||
_defaultBg = newBackgroundColor.with_alpha(0);
|
||||
|
||||
_colorTable[0] = til::color{ colorScheme.Black };
|
||||
_colorTable[1] = til::color{ colorScheme.Red };
|
||||
_colorTable[2] = til::color{ colorScheme.Green };
|
||||
_colorTable[3] = til::color{ colorScheme.Yellow };
|
||||
_colorTable[4] = til::color{ colorScheme.Blue };
|
||||
_colorTable[5] = til::color{ colorScheme.Purple };
|
||||
_colorTable[6] = til::color{ colorScheme.Cyan };
|
||||
_colorTable[7] = til::color{ colorScheme.White };
|
||||
_colorTable[8] = til::color{ colorScheme.BrightBlack };
|
||||
_colorTable[9] = til::color{ colorScheme.BrightRed };
|
||||
_colorTable[10] = til::color{ colorScheme.BrightGreen };
|
||||
_colorTable[11] = til::color{ colorScheme.BrightYellow };
|
||||
_colorTable[12] = til::color{ colorScheme.BrightBlue };
|
||||
_colorTable[13] = til::color{ colorScheme.BrightPurple };
|
||||
_colorTable[14] = til::color{ colorScheme.BrightCyan };
|
||||
_colorTable[15] = til::color{ colorScheme.BrightWhite };
|
||||
|
||||
_buffer->GetCursor().SetColor(til::color{ colorScheme.CursorColor });
|
||||
|
||||
if (_adjustIndistinguishableColors)
|
||||
{
|
||||
_MakeAdjustedColorArray();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -30,6 +30,7 @@ namespace winrt::Microsoft::Terminal::Core
|
|||
{
|
||||
struct ICoreSettings;
|
||||
struct ICoreAppearance;
|
||||
struct Scheme;
|
||||
}
|
||||
|
||||
namespace Microsoft::Terminal::Core
|
||||
|
@ -106,9 +107,11 @@ 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;
|
||||
bool SetDefaultForeground(const COLORREF color) noexcept override;
|
||||
bool SetDefaultBackground(const COLORREF color) noexcept override;
|
||||
|
||||
bool SetInputMode(const ::Microsoft::Console::VirtualTerminal::TerminalInput::Mode mode, const bool enabled) noexcept override;
|
||||
|
||||
|
@ -210,6 +213,10 @@ public:
|
|||
void ClearPatternTree() noexcept;
|
||||
|
||||
const std::optional<til::color> GetTabColor() const noexcept;
|
||||
til::color GetDefaultBackground() const noexcept;
|
||||
|
||||
winrt::Microsoft::Terminal::Core::Scheme GetColorScheme() const noexcept;
|
||||
void ApplyScheme(const winrt::Microsoft::Terminal::Core::Scheme& scheme);
|
||||
|
||||
Microsoft::Console::Render::BlinkingState& GetBlinkingState() const noexcept;
|
||||
|
||||
|
@ -278,7 +285,9 @@ private:
|
|||
std::optional<til::color> _startingTabColor;
|
||||
|
||||
// This is still stored as a COLORREF because it interacts with some code in ConTypes
|
||||
std::array<COLORREF, TextColor::TABLE_SIZE> _colorTable;
|
||||
std::array<COLORREF, XTERM_COLOR_TABLE_SIZE> _colorTable;
|
||||
til::color _defaultFg;
|
||||
til::color _defaultBg;
|
||||
CursorType _defaultCursorShape;
|
||||
bool _screenReversed;
|
||||
mutable Microsoft::Console::Render::BlinkingState _blinkingState;
|
||||
|
|
|
@ -69,6 +69,14 @@ COORD Terminal::GetCursorPosition() noexcept
|
|||
return newPos;
|
||||
}
|
||||
|
||||
bool Terminal::SetCursorColor(const COLORREF color) noexcept
|
||||
try
|
||||
{
|
||||
_buffer->GetCursor().SetColor(color);
|
||||
return true;
|
||||
}
|
||||
CATCH_RETURN_FALSE()
|
||||
|
||||
// Method Description:
|
||||
// - Moves the cursor down one line, and possibly also to the leftmost column.
|
||||
// Arguments:
|
||||
|
@ -362,22 +370,6 @@ 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.
|
||||
|
@ -391,11 +383,6 @@ try
|
|||
{
|
||||
_colorTable.at(tableIndex) = color;
|
||||
|
||||
if (tableIndex == TextColor::DEFAULT_BACKGROUND)
|
||||
{
|
||||
_pfnBackgroundColorChanged(color);
|
||||
}
|
||||
|
||||
// Repaint everything - the colors might have changed
|
||||
_buffer->GetRenderTarget().TriggerRedrawAll();
|
||||
return true;
|
||||
|
@ -455,6 +442,46 @@ bool Terminal::SetCursorStyle(const DispatchTypes::CursorStyle cursorStyle) noex
|
|||
return true;
|
||||
}
|
||||
|
||||
// Method Description:
|
||||
// - Updates the default foreground color from a COLORREF, format 0x00BBGGRR.
|
||||
// Arguments:
|
||||
// - color: the new COLORREF to use as the default foreground color
|
||||
// Return Value:
|
||||
// - true
|
||||
bool Terminal::SetDefaultForeground(const COLORREF color) noexcept
|
||||
try
|
||||
{
|
||||
_defaultFg = color;
|
||||
|
||||
// Repaint everything - the colors might have changed
|
||||
_buffer->GetRenderTarget().TriggerRedrawAll();
|
||||
return true;
|
||||
}
|
||||
CATCH_RETURN_FALSE()
|
||||
|
||||
// Method Description:
|
||||
// - Updates the default background color from a COLORREF, format 0x00BBGGRR.
|
||||
// Arguments:
|
||||
// - color: the new COLORREF to use as the default background color
|
||||
// Return Value:
|
||||
// - true
|
||||
bool Terminal::SetDefaultBackground(const COLORREF color) noexcept
|
||||
try
|
||||
{
|
||||
_defaultBg = color;
|
||||
_pfnBackgroundColorChanged(color);
|
||||
|
||||
// Repaint everything - the colors might have changed
|
||||
_buffer->GetRenderTarget().TriggerRedrawAll();
|
||||
return true;
|
||||
}
|
||||
CATCH_RETURN_FALSE()
|
||||
|
||||
til::color Terminal::GetDefaultBackground() const noexcept
|
||||
{
|
||||
return _defaultBg;
|
||||
}
|
||||
|
||||
bool Terminal::SetInputMode(const TerminalInput::Mode mode, const bool enabled) noexcept
|
||||
try
|
||||
{
|
||||
|
|
|
@ -227,7 +227,7 @@ CATCH_LOG_RETURN_FALSE()
|
|||
bool TerminalDispatch::SetCursorColor(const DWORD color) noexcept
|
||||
try
|
||||
{
|
||||
return _terminalApi.SetColorTableEntry(TextColor::CURSOR_COLOR, color);
|
||||
return _terminalApi.SetCursorColor(color);
|
||||
}
|
||||
CATCH_LOG_RETURN_FALSE()
|
||||
|
||||
|
@ -247,7 +247,7 @@ CATCH_LOG_RETURN_FALSE()
|
|||
bool TerminalDispatch::SetDefaultForeground(const DWORD color) noexcept
|
||||
try
|
||||
{
|
||||
return _terminalApi.SetColorTableEntry(TextColor::DEFAULT_FOREGROUND, color);
|
||||
return _terminalApi.SetDefaultForeground(color);
|
||||
}
|
||||
CATCH_LOG_RETURN_FALSE()
|
||||
|
||||
|
@ -260,7 +260,7 @@ CATCH_LOG_RETURN_FALSE()
|
|||
bool TerminalDispatch::SetDefaultBackground(const DWORD color) noexcept
|
||||
try
|
||||
{
|
||||
return _terminalApi.SetColorTableEntry(TextColor::DEFAULT_BACKGROUND, color);
|
||||
return _terminalApi.SetDefaultBackground(color);
|
||||
}
|
||||
CATCH_LOG_RETURN_FALSE()
|
||||
|
||||
|
|
|
@ -73,19 +73,19 @@ std::pair<COLORREF, COLORREF> Terminal::GetAttributeColors(const TextAttribute&
|
|||
if (attr.IsReverseVideo() ^ _screenReversed)
|
||||
{
|
||||
colors.first = _adjustedForegroundColors[fgIndex][bgIndex];
|
||||
colors.second = fgTextColor.GetColor(_colorTable, TextColor::DEFAULT_FOREGROUND);
|
||||
colors.second = fgTextColor.GetColor(_colorTable, _defaultFg);
|
||||
}
|
||||
else
|
||||
{
|
||||
colors.first = _adjustedForegroundColors[bgIndex][fgIndex];
|
||||
colors.second = bgTextColor.GetColor(_colorTable, TextColor::DEFAULT_BACKGROUND);
|
||||
colors.second = bgTextColor.GetColor(_colorTable, _defaultBg);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
colors = attr.CalculateRgbColors(_colorTable,
|
||||
TextColor::DEFAULT_FOREGROUND,
|
||||
TextColor::DEFAULT_BACKGROUND,
|
||||
_defaultFg,
|
||||
_defaultBg,
|
||||
_screenReversed,
|
||||
_blinkingState.IsBlinkingFaint(),
|
||||
_intenseIsBright);
|
||||
|
@ -135,7 +135,7 @@ CursorType Terminal::GetCursorStyle() const noexcept
|
|||
|
||||
COLORREF Terminal::GetCursorColor() const noexcept
|
||||
{
|
||||
return _colorTable.at(TextColor::CURSOR_COLOR);
|
||||
return _buffer->GetCursor().GetColor();
|
||||
}
|
||||
|
||||
bool Terminal::IsCursorDoubleWidth() const
|
||||
|
@ -312,8 +312,8 @@ void Terminal::_MakeAdjustedColorArray()
|
|||
// to include the default background and default foreground colors
|
||||
std::array<COLORREF, 18> colorTableWithDefaults;
|
||||
std::copy_n(std::begin(_colorTable), 16, std::begin(colorTableWithDefaults));
|
||||
colorTableWithDefaults[DefaultBgIndex] = _colorTable.at(TextColor::DEFAULT_BACKGROUND);
|
||||
colorTableWithDefaults[DefaultFgIndex] = _colorTable.at(TextColor::DEFAULT_FOREGROUND);
|
||||
colorTableWithDefaults[DefaultBgIndex] = _defaultBg;
|
||||
colorTableWithDefaults[DefaultFgIndex] = _defaultFg;
|
||||
for (auto fgIndex = 0; fgIndex < 18; ++fgIndex)
|
||||
{
|
||||
const auto fg = til::at(colorTableWithDefaults, fgIndex);
|
||||
|
|
|
@ -3,7 +3,6 @@
|
|||
|
||||
#include "pch.h"
|
||||
#include "Profiles.h"
|
||||
|
||||
#include "PreviewConnection.h"
|
||||
#include "Profiles.g.cpp"
|
||||
#include "EnumEntry.h"
|
||||
|
@ -11,54 +10,6 @@
|
|||
#include <LibraryResources.h>
|
||||
#include "..\WinRTUtils\inc\Utils.h"
|
||||
|
||||
// This function is a copy of DxFontInfo::_NearbyCollection() with
|
||||
// * the call to DxFontInfo::s_GetNearbyFonts() inlined
|
||||
// * checkForUpdates for GetSystemFontCollection() set to true
|
||||
static wil::com_ptr<IDWriteFontCollection1> NearbyCollection(IDWriteFactory* dwriteFactory)
|
||||
{
|
||||
// The convenience interfaces for loading fonts from files
|
||||
// are only available on Windows 10+.
|
||||
wil::com_ptr<IDWriteFactory6> factory6;
|
||||
// wil's query() facilities don't work inside WinRT land at the moment.
|
||||
// They produce a compilation error due to IUnknown and winrt::Windows::Foundation::IUnknown being ambiguous.
|
||||
if (!SUCCEEDED(dwriteFactory->QueryInterface(__uuidof(IDWriteFactory6), factory6.put_void())))
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
wil::com_ptr<IDWriteFontCollection1> systemFontCollection;
|
||||
THROW_IF_FAILED(factory6->GetSystemFontCollection(false, systemFontCollection.addressof(), true));
|
||||
|
||||
wil::com_ptr<IDWriteFontSet> systemFontSet;
|
||||
THROW_IF_FAILED(systemFontCollection->GetFontSet(systemFontSet.addressof()));
|
||||
|
||||
wil::com_ptr<IDWriteFontSetBuilder2> fontSetBuilder2;
|
||||
THROW_IF_FAILED(factory6->CreateFontSetBuilder(fontSetBuilder2.addressof()));
|
||||
|
||||
THROW_IF_FAILED(fontSetBuilder2->AddFontSet(systemFontSet.get()));
|
||||
|
||||
{
|
||||
const std::filesystem::path module{ wil::GetModuleFileNameW<std::wstring>(nullptr) };
|
||||
const auto folder{ module.parent_path() };
|
||||
|
||||
for (const auto& p : std::filesystem::directory_iterator(folder))
|
||||
{
|
||||
if (til::ends_with(p.path().native(), L".ttf"))
|
||||
{
|
||||
fontSetBuilder2->AddFontFile(p.path().c_str());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
wil::com_ptr<IDWriteFontSet> fontSet;
|
||||
THROW_IF_FAILED(fontSetBuilder2->CreateFontSet(fontSet.addressof()));
|
||||
|
||||
wil::com_ptr<IDWriteFontCollection1> fontCollection;
|
||||
THROW_IF_FAILED(factory6->CreateFontCollectionFromFontSet(fontSet.get(), &fontCollection));
|
||||
|
||||
return fontCollection;
|
||||
}
|
||||
|
||||
using namespace winrt::Windows::UI::Text;
|
||||
using namespace winrt::Windows::UI::Xaml;
|
||||
using namespace winrt::Windows::UI::Xaml::Controls;
|
||||
|
@ -156,7 +107,8 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
|
|||
reinterpret_cast<::IUnknown**>(factory.put())));
|
||||
|
||||
// get the font collection; subscribe to updates
|
||||
const auto fontCollection = NearbyCollection(factory.get());
|
||||
com_ptr<IDWriteFontCollection> fontCollection;
|
||||
THROW_IF_FAILED(factory->GetSystemFontCollection(fontCollection.put(), TRUE));
|
||||
|
||||
for (UINT32 i = 0; i < fontCollection->GetFontFamilyCount(); ++i)
|
||||
{
|
||||
|
@ -398,7 +350,7 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
|
|||
}
|
||||
|
||||
Profiles::Profiles() :
|
||||
_previewControl{ Control::TermControl(Model::TerminalSettings{}, make<PreviewConnection>()) }
|
||||
_previewControl{ Control::TermControl(Model::TerminalSettings{}, nullptr, make<PreviewConnection>()) }
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
|
@ -453,26 +405,23 @@ namespace winrt::Microsoft::Terminal::Settings::Editor::implementation
|
|||
{
|
||||
_PropertyChangedHandlers(*this, PropertyChangedEventArgs{ L"CurrentScrollState" });
|
||||
}
|
||||
_previewControl.Settings(_State.Profile().TermSettings());
|
||||
_previewControl.UpdateSettings();
|
||||
_previewControl.UpdateControlSettings(_State.Profile().TermSettings());
|
||||
});
|
||||
|
||||
// The Appearances object handles updating the values in the settings UI, but
|
||||
// we still need to listen to the changes here just to update the preview control
|
||||
_AppearanceViewModelChangedRevoker = _State.Profile().DefaultAppearance().PropertyChanged(winrt::auto_revoke, [=](auto&&, const PropertyChangedEventArgs& /*args*/) {
|
||||
_previewControl.Settings(_State.Profile().TermSettings());
|
||||
_previewControl.UpdateSettings();
|
||||
_previewControl.UpdateControlSettings(_State.Profile().TermSettings());
|
||||
});
|
||||
|
||||
// Navigate to the pivot in the provided navigation state
|
||||
ProfilesPivot().SelectedIndex(static_cast<int>(_State.LastActivePivot()));
|
||||
|
||||
_previewControl.Settings(_State.Profile().TermSettings());
|
||||
// There is a possibility that the control has not fully initialized yet,
|
||||
// so wait for it to initialize before updating the settings (so we know
|
||||
// that the renderer is set up)
|
||||
_previewControl.Initialized([&](auto&& /*s*/, auto&& /*e*/) {
|
||||
_previewControl.UpdateSettings();
|
||||
_previewControl.UpdateControlSettings(_State.Profile().TermSettings());
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
// Copyright (c) Microsoft Corporation.
|
||||
// Copyright (c) Microsoft Corporation.
|
||||
// Licensed under the MIT license.
|
||||
//
|
||||
// pch.h
|
||||
|
@ -51,7 +51,8 @@
|
|||
|
||||
#include <shlobj.h>
|
||||
#include <shobjidl_core.h>
|
||||
#include <dwrite_3.h>
|
||||
#include <dwrite.h>
|
||||
#include <dwrite_1.h>
|
||||
|
||||
// Manually include til after we include Windows.Foundation to give it winrt superpowers
|
||||
#include "til.h"
|
||||
|
|
|
@ -147,3 +147,30 @@ void ColorScheme::SetColorTableEntry(uint8_t index, const Core::Color& value) no
|
|||
THROW_HR_IF(E_INVALIDARG, index >= _table.size());
|
||||
_table[index] = value;
|
||||
}
|
||||
|
||||
winrt::Microsoft::Terminal::Core::Scheme ColorScheme::ToCoreScheme() const noexcept
|
||||
{
|
||||
winrt::Microsoft::Terminal::Core::Scheme coreScheme{};
|
||||
|
||||
coreScheme.Foreground = Foreground();
|
||||
coreScheme.Background = Background();
|
||||
coreScheme.CursorColor = CursorColor();
|
||||
coreScheme.SelectionBackground = SelectionBackground();
|
||||
coreScheme.Black = Table()[0];
|
||||
coreScheme.Red = Table()[1];
|
||||
coreScheme.Green = Table()[2];
|
||||
coreScheme.Yellow = Table()[3];
|
||||
coreScheme.Blue = Table()[4];
|
||||
coreScheme.Purple = Table()[5];
|
||||
coreScheme.Cyan = Table()[6];
|
||||
coreScheme.White = Table()[7];
|
||||
coreScheme.BrightBlack = Table()[8];
|
||||
coreScheme.BrightRed = Table()[9];
|
||||
coreScheme.BrightGreen = Table()[10];
|
||||
coreScheme.BrightYellow = Table()[11];
|
||||
coreScheme.BrightBlue = Table()[12];
|
||||
coreScheme.BrightPurple = Table()[13];
|
||||
coreScheme.BrightCyan = Table()[14];
|
||||
coreScheme.BrightWhite = Table()[15];
|
||||
return coreScheme;
|
||||
}
|
||||
|
|
|
@ -47,6 +47,8 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation
|
|||
static com_ptr<ColorScheme> FromJson(const Json::Value& json);
|
||||
Json::Value ToJson() const;
|
||||
|
||||
winrt::Microsoft::Terminal::Core::Scheme ToCoreScheme() const noexcept;
|
||||
|
||||
com_array<Core::Color> Table() const noexcept;
|
||||
void SetColorTableEntry(uint8_t index, const Core::Color& value) noexcept;
|
||||
|
||||
|
|
|
@ -19,5 +19,7 @@ namespace Microsoft.Terminal.Settings.Model
|
|||
// we expose the getter as a function.
|
||||
Microsoft.Terminal.Core.Color[] Table();
|
||||
void SetColorTableEntry(UInt8 index, Microsoft.Terminal.Core.Color value);
|
||||
|
||||
Microsoft.Terminal.Core.Scheme ToCoreScheme();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -197,29 +197,9 @@
|
|||
<Project>{CA5CAD1A-039A-4929-BA2A-8BEB2E4106FE}</Project>
|
||||
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
|
||||
</ProjectReference>
|
||||
|
||||
<!-- For whatever reason, we can't include the TerminalControl and
|
||||
TerminalSettings projects' winmds via project references. So we'll have to
|
||||
manually include the winmds as References below
|
||||
|
||||
BODGY: we do need to add a ProjectReference to TerminalControl.vcxproj,
|
||||
with Private=true, ReferenceOutputAssembly=false, so that Visual Studio's
|
||||
"Fast Up-to-date Check" will work with this project. If we don't, the Fast
|
||||
Up-to-date Check will look for the .xaml files from that project in our
|
||||
output, which won't actually be there.
|
||||
|
||||
We do still need to separately reference the winmds manually below, which is annoying.
|
||||
-->
|
||||
|
||||
<ProjectReference Include="$(OpenConsoleDir)src\cascadia\TerminalControl\dll\TerminalControl.vcxproj">
|
||||
<!-- Private:true and ReferenceOutputAssembly:false, in combination with
|
||||
the manual reference to TerminalControl.winmd below make sure that this
|
||||
project will compile correct, and that we won't roll up the TermControl
|
||||
xbf's into the packaging project twice. -->
|
||||
<Private>true</Private>
|
||||
<ReferenceOutputAssembly>false</ReferenceOutputAssembly>
|
||||
</ProjectReference>
|
||||
|
||||
manually include the winmds as References below -->
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<!-- Manually add references to each of our dependent winmds. Mark them as
|
||||
|
@ -286,5 +266,4 @@
|
|||
</Target>
|
||||
<Import Project="$(SolutionDir)build\rules\CollectWildcardResources.targets" />
|
||||
<Import Project="..\..\..\packages\Microsoft.VisualStudio.Setup.Configuration.Native.2.3.2262\build\native\Microsoft.VisualStudio.Setup.Configuration.Native.targets" Condition="Exists('..\..\..\packages\Microsoft.VisualStudio.Setup.Configuration.Native.2.3.2262\build\native\Microsoft.VisualStudio.Setup.Configuration.Native.targets')" />
|
||||
|
||||
</Project>
|
||||
|
|
|
@ -206,59 +206,6 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation
|
|||
_Opacity = appearance.Opacity();
|
||||
}
|
||||
|
||||
// Method Description:
|
||||
// - Creates a TerminalSettingsCreateResult from a parent TerminalSettingsCreateResult
|
||||
// - The returned defaultSettings inherits from the parent's defaultSettings, and the
|
||||
// returned unfocusedSettings inherits from the returned defaultSettings
|
||||
// - Note that the unfocused settings needs to be entirely unchanged _except_ we need to
|
||||
// set its parent to the other settings object that we return. This is because the overrides
|
||||
// made by the control will live in that other settings object, so we want to make
|
||||
// sure the unfocused settings inherit from that.
|
||||
// - Another way to think about this is that initially we have UnfocusedSettings inherit
|
||||
// from DefaultSettings. This function simply adds another TerminalSettings object
|
||||
// in the middle of these two, so UnfocusedSettings now inherits from the new object
|
||||
// and the new object inherits from the DefaultSettings. And this new object is what
|
||||
// the control can put overrides in.
|
||||
// Arguments:
|
||||
// - parent: the TerminalSettingsCreateResult that we create a new one from
|
||||
// Return Value:
|
||||
// - A TerminalSettingsCreateResult object that contains a defaultSettings that inherits
|
||||
// from parent's defaultSettings, and contains an unfocusedSettings that inherits from
|
||||
// its defaultSettings
|
||||
Model::TerminalSettingsCreateResult TerminalSettings::CreateWithParent(const Model::TerminalSettingsCreateResult& parent)
|
||||
{
|
||||
THROW_HR_IF_NULL(E_INVALIDARG, parent);
|
||||
|
||||
auto defaultImpl{ get_self<TerminalSettings>(parent.DefaultSettings()) };
|
||||
auto defaultChild = defaultImpl->CreateChild();
|
||||
if (parent.UnfocusedSettings())
|
||||
{
|
||||
parent.UnfocusedSettings().SetParent(*defaultChild);
|
||||
}
|
||||
return winrt::make<TerminalSettingsCreateResult>(*defaultChild, parent.UnfocusedSettings());
|
||||
}
|
||||
|
||||
// Method Description:
|
||||
// - Sets our parent to the provided TerminalSettings
|
||||
// Arguments:
|
||||
// - parent: our new parent
|
||||
void TerminalSettings::SetParent(const Model::TerminalSettings& parent)
|
||||
{
|
||||
ClearParents();
|
||||
com_ptr<TerminalSettings> parentImpl;
|
||||
parentImpl.copy_from(get_self<TerminalSettings>(parent));
|
||||
InsertParent(parentImpl);
|
||||
}
|
||||
|
||||
Model::TerminalSettings TerminalSettings::GetParent()
|
||||
{
|
||||
if (_parents.size() > 0)
|
||||
{
|
||||
return *_parents.at(0);
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// Method Description:
|
||||
// - Apply Profile settings, as well as any colors from our color scheme, if we have one.
|
||||
// Arguments:
|
||||
|
|
|
@ -64,12 +64,6 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation
|
|||
const Model::NewTerminalArgs& newTerminalArgs,
|
||||
const Control::IKeyBindings& keybindings);
|
||||
|
||||
static Model::TerminalSettingsCreateResult CreateWithParent(const Model::TerminalSettingsCreateResult& parent);
|
||||
|
||||
Model::TerminalSettings GetParent();
|
||||
|
||||
void SetParent(const Model::TerminalSettings& parent);
|
||||
|
||||
void ApplyColorScheme(const Model::ColorScheme& scheme);
|
||||
|
||||
// --------------------------- Core Settings ---------------------------
|
||||
|
@ -95,7 +89,6 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation
|
|||
INHERITABLE_SETTING(Model::TerminalSettings, uint32_t, CursorHeight, DEFAULT_CURSOR_HEIGHT);
|
||||
INHERITABLE_SETTING(Model::TerminalSettings, hstring, WordDelimiters, DEFAULT_WORD_DELIMITERS);
|
||||
INHERITABLE_SETTING(Model::TerminalSettings, bool, CopyOnSelect, false);
|
||||
INHERITABLE_SETTING(Model::TerminalSettings, bool, InputServiceWarning, true);
|
||||
INHERITABLE_SETTING(Model::TerminalSettings, bool, FocusFollowMouse, false);
|
||||
INHERITABLE_SETTING(Model::TerminalSettings, bool, TrimBlockSelection, false);
|
||||
INHERITABLE_SETTING(Model::TerminalSettings, bool, DetectURLs, true);
|
||||
|
|
|
@ -28,12 +28,16 @@ namespace Microsoft.Terminal.Settings.Model
|
|||
|
||||
static TerminalSettingsCreateResult CreateWithProfile(CascadiaSettings appSettings, Profile profile, Microsoft.Terminal.Control.IKeyBindings keybindings);
|
||||
static TerminalSettingsCreateResult CreateWithNewTerminalArgs(CascadiaSettings appSettings, NewTerminalArgs newTerminalArgs, Microsoft.Terminal.Control.IKeyBindings keybindings);
|
||||
static TerminalSettingsCreateResult CreateWithParent(TerminalSettingsCreateResult parent);
|
||||
|
||||
void SetParent(TerminalSettings parent);
|
||||
TerminalSettings GetParent();
|
||||
void ApplyColorScheme(ColorScheme scheme);
|
||||
|
||||
ColorScheme AppliedColorScheme;
|
||||
|
||||
// The getters for these are already defined in IControlSettings. So
|
||||
// we're just adding the setters here, because TerminalApp likes to be
|
||||
// able to change these at runtime (e.g. when duplicating a pane).
|
||||
String Commandline { set; };
|
||||
String StartingDirectory { set; };
|
||||
String EnvironmentVariables { set; };
|
||||
};
|
||||
}
|
||||
|
|
|
@ -65,7 +65,7 @@
|
|||
</ProjectReference>
|
||||
|
||||
<ProjectReference Include="$(OpenConsoleDir)src\cascadia\TerminalControl\dll\TerminalControl.vcxproj">
|
||||
<!-- Private:true and ReferenceOutputAssembly:false, in combination with
|
||||
<!-- Private:false and ReferenceOutputAssembly:false, in combination with
|
||||
the manual reference to TerminalControl.winmd below make sure that this
|
||||
project will compile correct, and that we won't roll up the TermControl
|
||||
xbf's into the packaging project twice. -->
|
||||
|
|
|
@ -67,7 +67,7 @@ namespace ControlUnitTests
|
|||
{
|
||||
Log::Comment(L"Create ControlCore object");
|
||||
|
||||
auto core = winrt::make_self<Control::implementation::ControlCore>(settings, conn);
|
||||
auto core = winrt::make_self<Control::implementation::ControlCore>(settings, settings, conn);
|
||||
core->_inUnitTests = true;
|
||||
return core;
|
||||
}
|
||||
|
@ -128,13 +128,14 @@ namespace ControlUnitTests
|
|||
double expectedOpacity = 0.5;
|
||||
auto opacityCallback = [&](auto&&, Control::TransparencyChangedEventArgs args) mutable {
|
||||
VERIFY_ARE_EQUAL(expectedOpacity, args.Opacity());
|
||||
VERIFY_ARE_EQUAL(expectedOpacity, settings->Opacity());
|
||||
VERIFY_ARE_EQUAL(expectedOpacity, core->_settings.Opacity());
|
||||
VERIFY_ARE_EQUAL(expectedOpacity, core->Opacity());
|
||||
// The Settings object's opacity shouldn't be changed
|
||||
VERIFY_ARE_EQUAL(0.5, settings->Opacity());
|
||||
|
||||
if (expectedOpacity < 1.0)
|
||||
{
|
||||
VERIFY_IS_TRUE(settings->UseAcrylic());
|
||||
VERIFY_IS_TRUE(core->_settings.UseAcrylic());
|
||||
VERIFY_IS_TRUE(core->_settings->UseAcrylic());
|
||||
}
|
||||
|
||||
// GH#603: Adjusting opacity shouldn't change whether or not we
|
||||
|
@ -142,8 +143,8 @@ namespace ControlUnitTests
|
|||
|
||||
auto expectedUseAcrylic = winrt::Microsoft::Terminal::Control::implementation::ControlCore::IsVintageOpacityAvailable() ? true :
|
||||
(expectedOpacity < 1.0 ? true : false);
|
||||
VERIFY_ARE_EQUAL(expectedUseAcrylic, settings->UseAcrylic());
|
||||
VERIFY_ARE_EQUAL(expectedUseAcrylic, core->_settings.UseAcrylic());
|
||||
VERIFY_ARE_EQUAL(expectedUseAcrylic, core->UseAcrylic());
|
||||
VERIFY_ARE_EQUAL(true, core->_settings->UseAcrylic());
|
||||
};
|
||||
core->TransparencyChanged(opacityCallback);
|
||||
|
||||
|
|
|
@ -71,7 +71,7 @@ namespace ControlUnitTests
|
|||
TerminalConnection::ITerminalConnection conn)
|
||||
{
|
||||
Log::Comment(L"Create ControlInteractivity object");
|
||||
auto interactivity = winrt::make_self<Control::implementation::ControlInteractivity>(settings, conn);
|
||||
auto interactivity = winrt::make_self<Control::implementation::ControlInteractivity>(settings, settings, conn);
|
||||
VERIFY_IS_NOT_NULL(interactivity);
|
||||
auto core = interactivity->_core;
|
||||
core->_inUnitTests = true;
|
||||
|
@ -116,13 +116,14 @@ namespace ControlUnitTests
|
|||
double expectedOpacity = 0.5;
|
||||
auto opacityCallback = [&](auto&&, Control::TransparencyChangedEventArgs args) mutable {
|
||||
VERIFY_ARE_EQUAL(expectedOpacity, args.Opacity());
|
||||
VERIFY_ARE_EQUAL(expectedOpacity, settings->Opacity());
|
||||
VERIFY_ARE_EQUAL(expectedOpacity, core->_settings.Opacity());
|
||||
VERIFY_ARE_EQUAL(expectedOpacity, core->Opacity());
|
||||
// The Settings object's opacity shouldn't be changed
|
||||
VERIFY_ARE_EQUAL(0.5, settings->Opacity());
|
||||
|
||||
auto expectedUseAcrylic = winrt::Microsoft::Terminal::Control::implementation::ControlCore::IsVintageOpacityAvailable() ? useAcrylic :
|
||||
(expectedOpacity < 1.0 ? true : false);
|
||||
VERIFY_ARE_EQUAL(expectedUseAcrylic, settings->UseAcrylic());
|
||||
VERIFY_ARE_EQUAL(expectedUseAcrylic, core->_settings.UseAcrylic());
|
||||
VERIFY_ARE_EQUAL(useAcrylic, settings->UseAcrylic());
|
||||
VERIFY_ARE_EQUAL(expectedUseAcrylic, core->UseAcrylic());
|
||||
};
|
||||
core->TransparencyChanged(opacityCallback);
|
||||
|
||||
|
|
|
@ -35,7 +35,6 @@ namespace ControlUnitTests
|
|||
WINRT_PROPERTY(uint32_t, CursorHeight, DEFAULT_CURSOR_HEIGHT);
|
||||
WINRT_PROPERTY(winrt::hstring, WordDelimiters, DEFAULT_WORD_DELIMITERS);
|
||||
WINRT_PROPERTY(bool, CopyOnSelect, false);
|
||||
WINRT_PROPERTY(bool, InputServiceWarning, true);
|
||||
WINRT_PROPERTY(bool, FocusFollowMouse, false);
|
||||
|
||||
WINRT_PROPERTY(winrt::Windows::Foundation::IReference<winrt::Microsoft::Terminal::Core::Color>, TabColor, nullptr);
|
||||
|
|
|
@ -96,10 +96,9 @@ class TerminalCoreUnitTests::ConptyRoundtripTests final
|
|||
auto& g = ServiceLocator::LocateGlobals();
|
||||
auto& gci = g.getConsoleInformation();
|
||||
|
||||
gci.SetColorTableEntry(TextColor::DEFAULT_FOREGROUND, INVALID_COLOR);
|
||||
gci.SetColorTableEntry(TextColor::DEFAULT_BACKGROUND, INVALID_COLOR);
|
||||
gci.SetDefaultForegroundColor(INVALID_COLOR);
|
||||
gci.SetDefaultBackgroundColor(INVALID_COLOR);
|
||||
gci.SetFillAttribute(0x07); // DARK_WHITE on DARK_BLACK
|
||||
gci.CalculateDefaultColorIndices();
|
||||
|
||||
m_state->PrepareNewTextBufferInfo(true, TerminalViewWidth, TerminalViewHeight);
|
||||
auto& currentBuffer = gci.GetActiveOutputBuffer();
|
||||
|
|
|
@ -59,6 +59,7 @@ void TerminalApiTest::SetColorTableEntry()
|
|||
VERIFY_IS_TRUE(term.SetColorTableEntry(128, 100));
|
||||
VERIFY_IS_TRUE(term.SetColorTableEntry(255, 100));
|
||||
|
||||
VERIFY_IS_FALSE(term.SetColorTableEntry(256, 100));
|
||||
VERIFY_IS_FALSE(term.SetColorTableEntry(512, 100));
|
||||
}
|
||||
|
||||
|
@ -270,7 +271,7 @@ void TerminalCoreUnitTests::TerminalApiTest::AddHyperlink()
|
|||
auto& stateMachine = *(term._stateMachine);
|
||||
|
||||
// Process the opening osc 8 sequence
|
||||
stateMachine.ProcessString(L"\x1b]8;;test.url\x1b\\");
|
||||
stateMachine.ProcessString(L"\x1b]8;;test.url\x9c");
|
||||
VERIFY_IS_TRUE(tbi.GetCurrentAttributes().IsHyperlink());
|
||||
VERIFY_ARE_EQUAL(tbi.GetHyperlinkUriFromId(tbi.GetCurrentAttributes().GetHyperlinkId()), L"test.url");
|
||||
|
||||
|
@ -280,7 +281,7 @@ void TerminalCoreUnitTests::TerminalApiTest::AddHyperlink()
|
|||
VERIFY_ARE_EQUAL(tbi.GetHyperlinkUriFromId(tbi.GetCurrentAttributes().GetHyperlinkId()), L"test.url");
|
||||
|
||||
// Process the closing osc 8 sequences
|
||||
stateMachine.ProcessString(L"\x1b]8;;\x1b\\");
|
||||
stateMachine.ProcessString(L"\x1b]8;;\x9c");
|
||||
VERIFY_IS_FALSE(tbi.GetCurrentAttributes().IsHyperlink());
|
||||
}
|
||||
|
||||
|
@ -296,7 +297,7 @@ void TerminalCoreUnitTests::TerminalApiTest::AddHyperlinkCustomId()
|
|||
auto& stateMachine = *(term._stateMachine);
|
||||
|
||||
// Process the opening osc 8 sequence
|
||||
stateMachine.ProcessString(L"\x1b]8;id=myId;test.url\x1b\\");
|
||||
stateMachine.ProcessString(L"\x1b]8;id=myId;test.url\x9c");
|
||||
VERIFY_IS_TRUE(tbi.GetCurrentAttributes().IsHyperlink());
|
||||
VERIFY_ARE_EQUAL(tbi.GetHyperlinkUriFromId(tbi.GetCurrentAttributes().GetHyperlinkId()), L"test.url");
|
||||
VERIFY_ARE_EQUAL(tbi.GetHyperlinkId(L"test.url", L"myId"), tbi.GetCurrentAttributes().GetHyperlinkId());
|
||||
|
@ -308,7 +309,7 @@ void TerminalCoreUnitTests::TerminalApiTest::AddHyperlinkCustomId()
|
|||
VERIFY_ARE_EQUAL(tbi.GetHyperlinkId(L"test.url", L"myId"), tbi.GetCurrentAttributes().GetHyperlinkId());
|
||||
|
||||
// Process the closing osc 8 sequences
|
||||
stateMachine.ProcessString(L"\x1b]8;;\x1b\\");
|
||||
stateMachine.ProcessString(L"\x1b]8;;\x9c");
|
||||
VERIFY_IS_FALSE(tbi.GetCurrentAttributes().IsHyperlink());
|
||||
}
|
||||
|
||||
|
@ -324,7 +325,7 @@ void TerminalCoreUnitTests::TerminalApiTest::AddHyperlinkCustomIdDifferentUri()
|
|||
auto& stateMachine = *(term._stateMachine);
|
||||
|
||||
// Process the opening osc 8 sequence
|
||||
stateMachine.ProcessString(L"\x1b]8;id=myId;test.url\x1b\\");
|
||||
stateMachine.ProcessString(L"\x1b]8;id=myId;test.url\x9c");
|
||||
VERIFY_IS_TRUE(tbi.GetCurrentAttributes().IsHyperlink());
|
||||
VERIFY_ARE_EQUAL(tbi.GetHyperlinkUriFromId(tbi.GetCurrentAttributes().GetHyperlinkId()), L"test.url");
|
||||
VERIFY_ARE_EQUAL(tbi.GetHyperlinkId(L"test.url", L"myId"), tbi.GetCurrentAttributes().GetHyperlinkId());
|
||||
|
@ -332,7 +333,7 @@ void TerminalCoreUnitTests::TerminalApiTest::AddHyperlinkCustomIdDifferentUri()
|
|||
const auto oldAttributes{ tbi.GetCurrentAttributes() };
|
||||
|
||||
// Send any other text
|
||||
stateMachine.ProcessString(L"\x1b]8;id=myId;other.url\x1b\\");
|
||||
stateMachine.ProcessString(L"\x1b]8;id=myId;other.url\x9c");
|
||||
VERIFY_IS_TRUE(tbi.GetCurrentAttributes().IsHyperlink());
|
||||
VERIFY_ARE_EQUAL(tbi.GetHyperlinkUriFromId(tbi.GetCurrentAttributes().GetHyperlinkId()), L"other.url");
|
||||
VERIFY_ARE_EQUAL(tbi.GetHyperlinkId(L"other.url", L"myId"), tbi.GetCurrentAttributes().GetHyperlinkId());
|
||||
|
@ -355,58 +356,58 @@ void TerminalCoreUnitTests::TerminalApiTest::SetTaskbarProgress()
|
|||
VERIFY_ARE_EQUAL(term.GetTaskbarProgress(), gsl::narrow<size_t>(0));
|
||||
|
||||
// Set some values for taskbar state and progress through state machine
|
||||
stateMachine.ProcessString(L"\x1b]9;4;1;50\x1b\\");
|
||||
stateMachine.ProcessString(L"\x1b]9;4;1;50\x9c");
|
||||
VERIFY_ARE_EQUAL(term.GetTaskbarState(), gsl::narrow<size_t>(1));
|
||||
VERIFY_ARE_EQUAL(term.GetTaskbarProgress(), gsl::narrow<size_t>(50));
|
||||
|
||||
// Reset to 0
|
||||
stateMachine.ProcessString(L"\x1b]9;4;0;0\x1b\\");
|
||||
stateMachine.ProcessString(L"\x1b]9;4;0;0\x9c");
|
||||
VERIFY_ARE_EQUAL(term.GetTaskbarState(), gsl::narrow<size_t>(0));
|
||||
VERIFY_ARE_EQUAL(term.GetTaskbarProgress(), gsl::narrow<size_t>(0));
|
||||
|
||||
// Set an out of bounds value for state
|
||||
stateMachine.ProcessString(L"\x1b]9;4;5;50\x1b\\");
|
||||
stateMachine.ProcessString(L"\x1b]9;4;5;50\x9c");
|
||||
// Nothing should have changed (dispatch should have returned false)
|
||||
VERIFY_ARE_EQUAL(term.GetTaskbarState(), gsl::narrow<size_t>(0));
|
||||
VERIFY_ARE_EQUAL(term.GetTaskbarProgress(), gsl::narrow<size_t>(0));
|
||||
|
||||
// Set an out of bounds value for progress
|
||||
stateMachine.ProcessString(L"\x1b]9;4;1;999\x1b\\");
|
||||
stateMachine.ProcessString(L"\x1b]9;4;1;999\x9c");
|
||||
// Progress should have been clamped to 100
|
||||
VERIFY_ARE_EQUAL(term.GetTaskbarState(), gsl::narrow<size_t>(1));
|
||||
VERIFY_ARE_EQUAL(term.GetTaskbarProgress(), gsl::narrow<size_t>(100));
|
||||
|
||||
// Don't specify any params
|
||||
stateMachine.ProcessString(L"\x1b]9;4\x1b\\");
|
||||
stateMachine.ProcessString(L"\x1b]9;4\x9c");
|
||||
// State and progress should both be reset to 0
|
||||
VERIFY_ARE_EQUAL(term.GetTaskbarState(), gsl::narrow<size_t>(0));
|
||||
VERIFY_ARE_EQUAL(term.GetTaskbarProgress(), gsl::narrow<size_t>(0));
|
||||
|
||||
// Specify additional params
|
||||
stateMachine.ProcessString(L"\x1b]9;4;1;80;123\x1b\\");
|
||||
stateMachine.ProcessString(L"\x1b]9;4;1;80;123\x9c");
|
||||
// Additional params should be ignored, state and progress still set normally
|
||||
VERIFY_ARE_EQUAL(term.GetTaskbarState(), gsl::narrow<size_t>(1));
|
||||
VERIFY_ARE_EQUAL(term.GetTaskbarProgress(), gsl::narrow<size_t>(80));
|
||||
|
||||
// Edge cases + trailing semicolon testing
|
||||
stateMachine.ProcessString(L"\x1b]9;4;2;\x1b\\");
|
||||
stateMachine.ProcessString(L"\x1b]9;4;2;\x9c");
|
||||
// String should be processed correctly despite the trailing semicolon,
|
||||
// taskbar progress should remain unchanged from previous value
|
||||
VERIFY_ARE_EQUAL(term.GetTaskbarState(), gsl::narrow<size_t>(2));
|
||||
VERIFY_ARE_EQUAL(term.GetTaskbarProgress(), gsl::narrow<size_t>(80));
|
||||
|
||||
stateMachine.ProcessString(L"\x1b]9;4;3;75\x1b\\");
|
||||
stateMachine.ProcessString(L"\x1b]9;4;3;75\x9c");
|
||||
// Given progress value should be ignored because this is the indeterminate state,
|
||||
// so the progress value should remain unchanged
|
||||
VERIFY_ARE_EQUAL(term.GetTaskbarState(), gsl::narrow<size_t>(3));
|
||||
VERIFY_ARE_EQUAL(term.GetTaskbarProgress(), gsl::narrow<size_t>(80));
|
||||
|
||||
stateMachine.ProcessString(L"\x1b]9;4;0;50\x1b\\");
|
||||
stateMachine.ProcessString(L"\x1b]9;4;0;50\x9c");
|
||||
// Taskbar progress should be 0 (the given value should be ignored)
|
||||
VERIFY_ARE_EQUAL(term.GetTaskbarState(), gsl::narrow<size_t>(0));
|
||||
VERIFY_ARE_EQUAL(term.GetTaskbarProgress(), gsl::narrow<size_t>(0));
|
||||
|
||||
stateMachine.ProcessString(L"\x1b]9;4;2;\x1b\\");
|
||||
stateMachine.ProcessString(L"\x1b]9;4;2;\x9c");
|
||||
// String should be processed correctly despite the trailing semicolon,
|
||||
// taskbar progress should be set to a 'minimum', non-zero value
|
||||
VERIFY_ARE_EQUAL(term.GetTaskbarState(), gsl::narrow<size_t>(2));
|
||||
|
@ -426,45 +427,45 @@ void TerminalCoreUnitTests::TerminalApiTest::SetWorkingDirectory()
|
|||
VERIFY_IS_TRUE(term.GetWorkingDirectory().empty());
|
||||
|
||||
// Invalid sequences should not change CWD
|
||||
stateMachine.ProcessString(L"\x1b]9;9\x1b\\");
|
||||
stateMachine.ProcessString(L"\x1b]9;9\x9c");
|
||||
VERIFY_IS_TRUE(term.GetWorkingDirectory().empty());
|
||||
|
||||
stateMachine.ProcessString(L"\x1b]9;9\"\x1b\\");
|
||||
stateMachine.ProcessString(L"\x1b]9;9\"\x9c");
|
||||
VERIFY_IS_TRUE(term.GetWorkingDirectory().empty());
|
||||
|
||||
stateMachine.ProcessString(L"\x1b]9;9\"C:\\\"\x1b\\");
|
||||
stateMachine.ProcessString(L"\x1b]9;9\"C:\\\"\x9c");
|
||||
VERIFY_IS_TRUE(term.GetWorkingDirectory().empty());
|
||||
|
||||
// Valid sequences should change CWD
|
||||
stateMachine.ProcessString(L"\x1b]9;9;\"C:\\\"\x1b\\");
|
||||
stateMachine.ProcessString(L"\x1b]9;9;\"C:\\\"\x9c");
|
||||
VERIFY_ARE_EQUAL(term.GetWorkingDirectory(), L"C:\\");
|
||||
|
||||
stateMachine.ProcessString(L"\x1b]9;9;\"C:\\Program Files\"\x1b\\");
|
||||
stateMachine.ProcessString(L"\x1b]9;9;\"C:\\Program Files\"\x9c");
|
||||
VERIFY_ARE_EQUAL(term.GetWorkingDirectory(), L"C:\\Program Files");
|
||||
|
||||
stateMachine.ProcessString(L"\x1b]9;9;\"D:\\中文\"\x1b\\");
|
||||
stateMachine.ProcessString(L"\x1b]9;9;\"D:\\中文\"\x9c");
|
||||
VERIFY_ARE_EQUAL(term.GetWorkingDirectory(), L"D:\\中文");
|
||||
|
||||
// Test OSC 9;9 sequences without quotation marks
|
||||
stateMachine.ProcessString(L"\x1b]9;9;C:\\\x1b\\");
|
||||
stateMachine.ProcessString(L"\x1b]9;9;C:\\\x9c");
|
||||
VERIFY_ARE_EQUAL(term.GetWorkingDirectory(), L"C:\\");
|
||||
|
||||
stateMachine.ProcessString(L"\x1b]9;9;C:\\Program Files\x1b\\");
|
||||
stateMachine.ProcessString(L"\x1b]9;9;C:\\Program Files\x9c");
|
||||
VERIFY_ARE_EQUAL(term.GetWorkingDirectory(), L"C:\\Program Files");
|
||||
|
||||
stateMachine.ProcessString(L"\x1b]9;9;D:\\中文\x1b\\");
|
||||
stateMachine.ProcessString(L"\x1b]9;9;D:\\中文\x9c");
|
||||
VERIFY_ARE_EQUAL(term.GetWorkingDirectory(), L"D:\\中文");
|
||||
|
||||
// These OSC 9;9 sequences will result in invalid CWD. We shouldn't crash on these.
|
||||
stateMachine.ProcessString(L"\x1b]9;9;\"\x1b\\");
|
||||
stateMachine.ProcessString(L"\x1b]9;9;\"\x9c");
|
||||
VERIFY_ARE_EQUAL(term.GetWorkingDirectory(), L"\"");
|
||||
|
||||
stateMachine.ProcessString(L"\x1b]9;9;\"\"\x1b\\");
|
||||
stateMachine.ProcessString(L"\x1b]9;9;\"\"\x9c");
|
||||
VERIFY_ARE_EQUAL(term.GetWorkingDirectory(), L"\"\"");
|
||||
|
||||
stateMachine.ProcessString(L"\x1b]9;9;\"\"\"\x1b\\");
|
||||
stateMachine.ProcessString(L"\x1b]9;9;\"\"\"\x9c");
|
||||
VERIFY_ARE_EQUAL(term.GetWorkingDirectory(), L"\"");
|
||||
|
||||
stateMachine.ProcessString(L"\x1b]9;9;\"\"\"\"\x1b\\");
|
||||
stateMachine.ProcessString(L"\x1b]9;9;\"\"\"\"\x9c");
|
||||
VERIFY_ARE_EQUAL(term.GetWorkingDirectory(), L"\"\"");
|
||||
}
|
||||
|
|
|
@ -115,23 +115,6 @@
|
|||
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
|
||||
</PropertyGroup>
|
||||
|
||||
<!--
|
||||
BODGY
|
||||
|
||||
The wapproj `GetResolvedWinMD` target tries to get a winmd from every cppwinrt
|
||||
executable we put in the package. But we DON'T produce a winmd. This makes the
|
||||
FastUpToDate check fail every time, and leads to the whole wapproj build
|
||||
running even if you're just f5'ing the package. EVEN AFTER A SUCCESSFUL BUILD.
|
||||
|
||||
Setting GenerateWindowsMetadata=false is enough to tell the build system that
|
||||
we don't produce one, and get it off our backs.
|
||||
-->
|
||||
<ItemDefinitionGroup>
|
||||
<Link>
|
||||
<GenerateWindowsMetadata>false</GenerateWindowsMetadata>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
|
||||
<Import Project="$(OpenConsoleDir)src\cppwinrt.build.post.props" />
|
||||
|
||||
<Import Project="..\..\..\packages\Microsoft.UI.Xaml.2.7.0-prerelease.210913003\build\native\Microsoft.UI.Xaml.targets" Condition="Exists('..\..\..\packages\Microsoft.UI.Xaml.2.7.0-prerelease.210913003\build\native\Microsoft.UI.Xaml.targets')" />
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
</Properties>
|
||||
|
||||
<Dependencies>
|
||||
<TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.18362.0" MaxVersionTested="10.0.22000.0" />
|
||||
<TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.18362.0" MaxVersionTested="10.0.19041.0" />
|
||||
</Dependencies>
|
||||
|
||||
<Resources>
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
</Properties>
|
||||
|
||||
<Dependencies>
|
||||
<TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.18362.0" MaxVersionTested="10.0.22000.0" />
|
||||
<TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.18362.0" MaxVersionTested="10.0.19041.0" />
|
||||
</Dependencies>
|
||||
|
||||
<Resources>
|
||||
|
|
70
src/cascadia/inc/ControlProperties.h
Normal file
70
src/cascadia/inc/ControlProperties.h
Normal file
|
@ -0,0 +1,70 @@
|
|||
// Copyright (c) Microsoft Corporation.
|
||||
// Licensed under the MIT license.
|
||||
|
||||
#pragma once
|
||||
|
||||
// --------------------------- Core Appearance ---------------------------
|
||||
// All of these settings are defined in ICoreAppearance.
|
||||
#define CORE_APPEARANCE_SETTINGS(X) \
|
||||
X(til::color, DefaultForeground, DEFAULT_FOREGROUND) \
|
||||
X(til::color, DefaultBackground, DEFAULT_BACKGROUND) \
|
||||
X(til::color, CursorColor, DEFAULT_CURSOR_COLOR) \
|
||||
X(winrt::Microsoft::Terminal::Core::CursorStyle, CursorShape, winrt::Microsoft::Terminal::Core::CursorStyle::Vintage) \
|
||||
X(uint32_t, CursorHeight, DEFAULT_CURSOR_HEIGHT) \
|
||||
X(bool, IntenseIsBright, true) \
|
||||
X(bool, AdjustIndistinguishableColors, true)
|
||||
|
||||
// --------------------------- Control Appearance ---------------------------
|
||||
// All of these settings are defined in IControlSettings.
|
||||
#define CONTROL_APPEARANCE_SETTINGS(X) \
|
||||
X(til::color, SelectionBackground, DEFAULT_FOREGROUND) \
|
||||
X(double, Opacity, 1.0) \
|
||||
X(winrt::hstring, BackgroundImage) \
|
||||
X(double, BackgroundImageOpacity, 1.0) \
|
||||
X(winrt::Windows::UI::Xaml::Media::Stretch, BackgroundImageStretchMode, winrt::Windows::UI::Xaml::Media::Stretch::UniformToFill) \
|
||||
X(winrt::Windows::UI::Xaml::HorizontalAlignment, BackgroundImageHorizontalAlignment, winrt::Windows::UI::Xaml::HorizontalAlignment::Center) \
|
||||
X(winrt::Windows::UI::Xaml::VerticalAlignment, BackgroundImageVerticalAlignment, winrt::Windows::UI::Xaml::VerticalAlignment::Center) \
|
||||
X(bool, IntenseIsBold) \
|
||||
X(bool, RetroTerminalEffect, false) \
|
||||
X(winrt::hstring, PixelShaderPath)
|
||||
|
||||
// --------------------------- Core Settings ---------------------------
|
||||
// All of these settings are defined in ICoreSettings.
|
||||
#define CORE_SETTINGS(X) \
|
||||
X(int32_t, HistorySize, DEFAULT_HISTORY_SIZE) \
|
||||
X(int32_t, InitialRows, 30) \
|
||||
X(int32_t, InitialCols, 80) \
|
||||
X(bool, SnapOnInput, true) \
|
||||
X(bool, AltGrAliasing, true) \
|
||||
X(winrt::hstring, WordDelimiters, DEFAULT_WORD_DELIMITERS) \
|
||||
X(bool, CopyOnSelect, false) \
|
||||
X(bool, FocusFollowMouse, false) \
|
||||
X(winrt::Windows::Foundation::IReference<winrt::Microsoft::Terminal::Core::Color>, TabColor, nullptr) \
|
||||
X(winrt::Windows::Foundation::IReference<winrt::Microsoft::Terminal::Core::Color>, StartingTabColor, nullptr) \
|
||||
X(bool, TrimBlockSelection, false) \
|
||||
X(bool, DetectURLs, true)
|
||||
|
||||
// --------------------------- Control Settings ---------------------------
|
||||
// All of these settings are defined in IControlSettings.
|
||||
#define CONTROL_SETTINGS(X) \
|
||||
X(winrt::hstring, ProfileName) \
|
||||
X(winrt::hstring, ProfileSource) \
|
||||
X(bool, UseAcrylic, false) \
|
||||
X(winrt::hstring, Padding, DEFAULT_PADDING) \
|
||||
X(winrt::hstring, FontFace, L"Consolas") \
|
||||
X(int32_t, FontSize, DEFAULT_FONT_SIZE) \
|
||||
X(winrt::Windows::UI::Text::FontWeight, FontWeight) \
|
||||
X(IFontFeatureMap, FontFeatures) \
|
||||
X(IFontAxesMap, FontAxes) \
|
||||
X(winrt::Microsoft::Terminal::Control::IKeyBindings, KeyBindings, nullptr) \
|
||||
X(winrt::hstring, Commandline) \
|
||||
X(winrt::hstring, StartingDirectory) \
|
||||
X(winrt::hstring, StartingTitle) \
|
||||
X(bool, SuppressApplicationTitle) \
|
||||
X(winrt::hstring, EnvironmentVariables) \
|
||||
X(winrt::Microsoft::Terminal::Control::ScrollbarState, ScrollState, winrt::Microsoft::Terminal::Control::ScrollbarState::Visible) \
|
||||
X(winrt::Microsoft::Terminal::Control::TextAntialiasingMode, AntialiasingMode, winrt::Microsoft::Terminal::Control::TextAntialiasingMode::Grayscale) \
|
||||
X(bool, ForceFullRepaintRendering, false) \
|
||||
X(bool, SoftwareRendering, false) \
|
||||
X(bool, ForceVTInput, false) \
|
||||
X(bool, UseAtlasEngine, false)
|
|
@ -29,7 +29,7 @@
|
|||
<Description>TAEF Packaged Cwa FullTrust Application Host Process</Description>
|
||||
</Properties>
|
||||
<Dependencies>
|
||||
<TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.18362.0" MaxVersionTested="10.0.22000.0" />
|
||||
<TargetDeviceFamily Name="Windows.Universal" MinVersion="10.0.18362.0" MaxVersionTested="10.0.19041.0" />
|
||||
<PackageDependency Name="Microsoft.VCLibs.140.00.Debug" MinVersion="14.0.27023.1" Publisher="CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US" />
|
||||
<PackageDependency Name="Microsoft.VCLibs.140.00.Debug.UWPDesktop" MinVersion="14.0.27027.1" Publisher="CN=Microsoft Corporation, O=Microsoft Corporation, L=Redmond, S=Washington, C=US" />
|
||||
</Dependencies>
|
||||
|
|
|
@ -75,7 +75,7 @@
|
|||
</ItemGroup>
|
||||
|
||||
<PropertyGroup Label="Globals">
|
||||
<WindowsTargetPlatformVersion Condition="'$(WindowsTargetPlatformVersion)' == ''">10.0.22000.0</WindowsTargetPlatformVersion>
|
||||
<WindowsTargetPlatformVersion Condition="'$(WindowsTargetPlatformVersion)' == ''">10.0.19041.0</WindowsTargetPlatformVersion>
|
||||
<WindowsTargetPlatformMinVersion Condition="'$(WindowsTargetPlatformMinVersion)' == ''">10.0.18362.0</WindowsTargetPlatformMinVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
|
|
|
@ -219,6 +219,36 @@ InputBuffer* const CONSOLE_INFORMATION::GetActiveInputBuffer() const
|
|||
return pInputBuffer;
|
||||
}
|
||||
|
||||
// Method Description:
|
||||
// - Return the default foreground color of the console. If the settings are
|
||||
// configured to have a default foreground color (separate from the color
|
||||
// table), this will return that value. Otherwise it will return the value
|
||||
// from the colortable corresponding to our default attributes.
|
||||
// Arguments:
|
||||
// - <none>
|
||||
// Return Value:
|
||||
// - the default foreground color of the console.
|
||||
COLORREF CONSOLE_INFORMATION::GetDefaultForeground() const noexcept
|
||||
{
|
||||
const auto fg = GetDefaultForegroundColor();
|
||||
return fg != INVALID_COLOR ? fg : GetLegacyColorTableEntry(LOBYTE(GetFillAttribute()) & FG_ATTRS);
|
||||
}
|
||||
|
||||
// Method Description:
|
||||
// - Return the default background color of the console. If the settings are
|
||||
// configured to have a default background color (separate from the color
|
||||
// table), this will return that value. Otherwise it will return the value
|
||||
// from the colortable corresponding to our default attributes.
|
||||
// Arguments:
|
||||
// - <none>
|
||||
// Return Value:
|
||||
// - the default background color of the console.
|
||||
COLORREF CONSOLE_INFORMATION::GetDefaultBackground() const noexcept
|
||||
{
|
||||
const auto bg = GetDefaultBackgroundColor();
|
||||
return bg != INVALID_COLOR ? bg : GetLegacyColorTableEntry((LOBYTE(GetFillAttribute()) & BG_ATTRS) >> 4);
|
||||
}
|
||||
|
||||
// Method Description:
|
||||
// - Get the colors of a particular text attribute, using our color table,
|
||||
// and our configured default attributes.
|
||||
|
@ -227,12 +257,26 @@ InputBuffer* const CONSOLE_INFORMATION::GetActiveInputBuffer() const
|
|||
// Return Value:
|
||||
// - The color values of the attribute's foreground and background.
|
||||
std::pair<COLORREF, COLORREF> CONSOLE_INFORMATION::LookupAttributeColors(const TextAttribute& attr) const noexcept
|
||||
{
|
||||
return LookupAttributeColors(attr, GetDefaultForeground(), GetDefaultBackground());
|
||||
}
|
||||
|
||||
// Method Description:
|
||||
// - Get the colors of a particular text attribute, using our color table,
|
||||
// and the given default color values.
|
||||
// Arguments:
|
||||
// - attr: the TextAttribute to retrieve the foreground and background color of.
|
||||
// - defaultFg: the COLORREF to use for a default foreground color.
|
||||
// - defaultBg: the COLORREF to use for a default background color.
|
||||
// Return Value:
|
||||
// - The color values of the attribute's foreground and background.
|
||||
std::pair<COLORREF, COLORREF> CONSOLE_INFORMATION::LookupAttributeColors(const TextAttribute& attr, const COLORREF defaultFg, const COLORREF defaultBg) const noexcept
|
||||
{
|
||||
_blinkingState.RecordBlinkingUsage(attr);
|
||||
return attr.CalculateRgbColors(
|
||||
GetColorTable(),
|
||||
GetDefaultForegroundIndex(),
|
||||
GetDefaultBackgroundIndex(),
|
||||
defaultFg,
|
||||
defaultBg,
|
||||
IsScreenReversed(),
|
||||
_blinkingState.IsBlinkingFaint());
|
||||
}
|
||||
|
|
|
@ -143,7 +143,7 @@
|
|||
<Import Project="$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets" Condition="Exists('$(VSToolsPath)\TeamTest\Microsoft.TestTools.targets')" />
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<PropertyGroup>
|
||||
<PostBuildEvent>copy "$(SolutionDir)\dep\WinAppDriver\*" "$(OutDir)\"</PostBuildEvent>
|
||||
<PostBuildEvent>copy $(SolutionDir)\dep\WinAppDriver\* $(OutDir)\</PostBuildEvent>
|
||||
</PropertyGroup>
|
||||
<Import Project="..\..\..\packages\Microsoft.Taef.10.60.210621002\build\Microsoft.Taef.targets" Condition="Exists('..\..\..\packages\Microsoft.Taef.10.60.210621002\build\Microsoft.Taef.targets')" />
|
||||
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
|
||||
|
@ -152,4 +152,4 @@
|
|||
</PropertyGroup>
|
||||
<Error Condition="!Exists('..\..\..\packages\Microsoft.Taef.10.60.210621002\build\Microsoft.Taef.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\packages\Microsoft.Taef.10.60.210621002\build\Microsoft.Taef.targets'))" />
|
||||
</Target>
|
||||
</Project>
|
||||
</Project>
|
|
@ -1499,6 +1499,12 @@ void DoSrvSetCursorStyle(SCREEN_INFORMATION& screenInfo,
|
|||
screenInfo.GetActiveBuffer().GetTextBuffer().GetCursor().SetType(cursorType);
|
||||
}
|
||||
|
||||
void DoSrvSetCursorColor(SCREEN_INFORMATION& screenInfo,
|
||||
const COLORREF cursorColor)
|
||||
{
|
||||
screenInfo.GetActiveBuffer().GetTextBuffer().GetCursor().SetColor(cursorColor);
|
||||
}
|
||||
|
||||
void DoSrvAddHyperlink(SCREEN_INFORMATION& screenInfo,
|
||||
const std::wstring_view uri,
|
||||
const std::wstring_view params)
|
||||
|
@ -1957,6 +1963,115 @@ 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 >= 256);
|
||||
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();
|
||||
}
|
||||
|
||||
// Method Description:
|
||||
// - Sets the default foreground color to the color specified in value.
|
||||
// Arguments:
|
||||
// - value: the new RGB value to use, as a COLORREF, format 0x00BBGGRR.
|
||||
// Return Value:
|
||||
// - S_OK
|
||||
[[nodiscard]] HRESULT DoSrvPrivateSetDefaultForegroundColor(const COLORREF value) noexcept
|
||||
{
|
||||
try
|
||||
{
|
||||
Globals& g = ServiceLocator::LocateGlobals();
|
||||
CONSOLE_INFORMATION& gci = g.getConsoleInformation();
|
||||
|
||||
gci.SetDefaultForegroundColor(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();
|
||||
}
|
||||
|
||||
// Method Description:
|
||||
// - Sets the default background color to the color specified in value.
|
||||
// Arguments:
|
||||
// - value: the new RGB value to use, as a COLORREF, format 0x00BBGGRR.
|
||||
// Return Value:
|
||||
// - S_OK
|
||||
[[nodiscard]] HRESULT DoSrvPrivateSetDefaultBackgroundColor(const COLORREF value) noexcept
|
||||
{
|
||||
try
|
||||
{
|
||||
Globals& g = ServiceLocator::LocateGlobals();
|
||||
CONSOLE_INFORMATION& gci = g.getConsoleInformation();
|
||||
|
||||
gci.SetDefaultBackgroundColor(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:
|
||||
|
|
|
@ -36,6 +36,8 @@ void DoSrvPrivateUseMainScreenBuffer(SCREEN_INFORMATION& screenInfo);
|
|||
|
||||
void DoSrvSetCursorStyle(SCREEN_INFORMATION& screenInfo,
|
||||
const CursorType cursorType);
|
||||
void DoSrvSetCursorColor(SCREEN_INFORMATION& screenInfo,
|
||||
const COLORREF cursorColor);
|
||||
|
||||
void DoSrvAddHyperlink(SCREEN_INFORMATION& screenInfo,
|
||||
const std::wstring_view uri,
|
||||
|
@ -61,6 +63,13 @@ 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 DoSrvPrivateSetDefaultForegroundColor(const COLORREF value) noexcept;
|
||||
|
||||
[[nodiscard]] HRESULT DoSrvPrivateSetDefaultBackgroundColor(const COLORREF value) noexcept;
|
||||
|
||||
[[nodiscard]] HRESULT DoSrvPrivateFillRegion(SCREEN_INFORMATION& screenInfo,
|
||||
const COORD startPosition,
|
||||
const size_t fillLength,
|
||||
|
|
|
@ -15,7 +15,6 @@
|
|||
|
||||
using namespace Microsoft::Console;
|
||||
using Microsoft::Console::Interactivity::ServiceLocator;
|
||||
using Microsoft::Console::VirtualTerminal::StateMachine;
|
||||
using Microsoft::Console::VirtualTerminal::TerminalInput;
|
||||
|
||||
WriteBuffer::WriteBuffer(_In_ Microsoft::Console::IIoProvider& io) :
|
||||
|
@ -264,35 +263,22 @@ bool ConhostInternalGetSet::SetInputMode(const TerminalInput::Mode mode, const b
|
|||
}
|
||||
|
||||
// Routine Description:
|
||||
// - Sets the various StateMachine parser modes.
|
||||
// SetParserMode is an internal-only "API" call that the vt commands can execute,
|
||||
// - Sets the terminal emulation mode to either ANSI-compatible or VT52.
|
||||
// PrivateSetAnsiMode is an internal-only "API" call that the vt commands can execute,
|
||||
// but it is not represented as a function call on out public API surface.
|
||||
// Arguments:
|
||||
// - mode - the parser mode to change.
|
||||
// - enabled - set to true to enable the mode, false to disable it.
|
||||
// - ansiMode - set to true to enable the ANSI mode, false for VT52 mode.
|
||||
// Return Value:
|
||||
// - true if successful. false otherwise.
|
||||
bool ConhostInternalGetSet::SetParserMode(const StateMachine::Mode mode, const bool enabled)
|
||||
bool ConhostInternalGetSet::PrivateSetAnsiMode(const bool ansiMode)
|
||||
{
|
||||
auto& stateMachine = _io.GetActiveOutputBuffer().GetStateMachine();
|
||||
stateMachine.SetParserMode(mode, enabled);
|
||||
stateMachine.SetAnsiMode(ansiMode);
|
||||
auto& terminalInput = _io.GetActiveInputBuffer()->GetTerminalInput();
|
||||
terminalInput.SetInputMode(TerminalInput::Mode::Ansi, ansiMode);
|
||||
return true;
|
||||
}
|
||||
|
||||
// Routine Description:
|
||||
// - Retrieves the various StateMachine parser modes.
|
||||
// GetParserMode is an internal-only "API" call that the vt commands can execute,
|
||||
// but it is not represented as a function call on out public API surface.
|
||||
// Arguments:
|
||||
// - mode - the parser mode to query.
|
||||
// Return Value:
|
||||
// - true if the mode is enabled. false if disabled.
|
||||
bool ConhostInternalGetSet::GetParserMode(const Microsoft::Console::VirtualTerminal::StateMachine::Mode mode) const
|
||||
{
|
||||
auto& stateMachine = _io.GetActiveOutputBuffer().GetStateMachine();
|
||||
return stateMachine.GetParserMode(mode);
|
||||
}
|
||||
|
||||
// Routine Description:
|
||||
// - Connects the PrivateSetScreenMode call directly into our Driver Message servicing call inside Conhost.exe
|
||||
// PrivateSetScreenMode is an internal-only "API" call that the vt commands can execute,
|
||||
|
@ -552,6 +538,21 @@ bool ConhostInternalGetSet::PrivateSuppressResizeRepaint()
|
|||
return SUCCEEDED(DoSrvPrivateSuppressResizeRepaint());
|
||||
}
|
||||
|
||||
// Routine Description:
|
||||
// - Connects the SetCursorStyle call directly into our Driver Message servicing call inside Conhost.exe
|
||||
// SetCursorStyle is an internal-only "API" call that the vt commands can execute,
|
||||
// but it is not represented as a function call on our public API surface.
|
||||
// Arguments:
|
||||
// - cursorColor: The color to change the cursor to. INVALID_COLOR will revert
|
||||
// it to the legacy inverting behavior.
|
||||
// Return Value:
|
||||
// - true if successful (see DoSrvSetCursorStyle). false otherwise.
|
||||
bool ConhostInternalGetSet::SetCursorColor(const COLORREF cursorColor)
|
||||
{
|
||||
DoSrvSetCursorColor(_io.GetActiveOutputBuffer(), cursorColor);
|
||||
return true;
|
||||
}
|
||||
|
||||
// Routine Description:
|
||||
// - Connects the IsConsolePty call directly into our Driver Message servicing call inside Conhost.exe
|
||||
// - NOTE: This ONE method behaves differently! The rest of the methods on this
|
||||
|
@ -593,61 +594,54 @@ bool ConhostInternalGetSet::MoveToBottom() const
|
|||
}
|
||||
|
||||
// Method Description:
|
||||
// - Retrieves the value in the colortable at the specified index.
|
||||
// - Connects the PrivateGetColorTableEntry call directly into our Driver Message servicing
|
||||
// call inside Conhost.exe
|
||||
// Arguments:
|
||||
// - tableIndex: the index of the color table to retrieve.
|
||||
// - index: the index in the table to retrieve.
|
||||
// - value: receives the RGB value for the color at that index in the table.
|
||||
// Return Value:
|
||||
// - the COLORREF value for the color at that index in the table.
|
||||
COLORREF ConhostInternalGetSet::GetColorTableEntry(const size_t tableIndex) const noexcept
|
||||
try
|
||||
// - true if successful (see DoSrvPrivateGetColorTableEntry). false otherwise.
|
||||
bool ConhostInternalGetSet::PrivateGetColorTableEntry(const size_t index, COLORREF& value) const noexcept
|
||||
{
|
||||
auto& g = ServiceLocator::LocateGlobals();
|
||||
auto& gci = g.getConsoleInformation();
|
||||
|
||||
return gci.GetColorTableEntry(tableIndex);
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
return INVALID_COLOR;
|
||||
return SUCCEEDED(DoSrvPrivateGetColorTableEntry(index, value));
|
||||
}
|
||||
|
||||
// Method Description:
|
||||
// - Updates the value in the colortable at index tableIndex to the new color
|
||||
// color. color is a COLORREF, format 0x00BBGGRR.
|
||||
// - Connects the PrivateSetColorTableEntry call directly into our Driver Message servicing
|
||||
// call inside Conhost.exe
|
||||
// Arguments:
|
||||
// - tableIndex: the index of the color table to update.
|
||||
// - color: the new COLORREF to use as that color table value.
|
||||
// - index: the index in the table to change.
|
||||
// - value: the new RGB value to use for that index in the color table.
|
||||
// Return Value:
|
||||
// - true if successful. false otherwise.
|
||||
bool ConhostInternalGetSet::SetColorTableEntry(const size_t tableIndex, const COLORREF color) noexcept
|
||||
try
|
||||
// - true if successful (see DoSrvPrivateSetColorTableEntry). false otherwise.
|
||||
bool ConhostInternalGetSet::PrivateSetColorTableEntry(const size_t index, const COLORREF value) const noexcept
|
||||
{
|
||||
auto& g = ServiceLocator::LocateGlobals();
|
||||
auto& gci = g.getConsoleInformation();
|
||||
|
||||
gci.SetColorTableEntry(tableIndex, color);
|
||||
|
||||
// If we're setting the default foreground or background colors
|
||||
// we need to make sure the index is correctly set as well.
|
||||
if (tableIndex == TextColor::DEFAULT_FOREGROUND)
|
||||
{
|
||||
gci.SetDefaultForegroundIndex(TextColor::DEFAULT_FOREGROUND);
|
||||
}
|
||||
if (tableIndex == TextColor::DEFAULT_BACKGROUND)
|
||||
{
|
||||
gci.SetDefaultBackgroundIndex(TextColor::DEFAULT_BACKGROUND);
|
||||
}
|
||||
|
||||
// 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;
|
||||
return SUCCEEDED(DoSrvPrivateSetColorTableEntry(index, value));
|
||||
}
|
||||
|
||||
// Method Description:
|
||||
// - Connects the PrivateSetDefaultForeground call directly into our Driver Message servicing
|
||||
// call inside Conhost.exe
|
||||
// Arguments:
|
||||
// - value: the new RGB value to use, as a COLORREF, format 0x00BBGGRR.
|
||||
// Return Value:
|
||||
// - true if successful (see DoSrvPrivateSetDefaultForegroundColor). false otherwise.
|
||||
bool ConhostInternalGetSet::PrivateSetDefaultForeground(const COLORREF value) const noexcept
|
||||
{
|
||||
return SUCCEEDED(DoSrvPrivateSetDefaultForegroundColor(value));
|
||||
}
|
||||
|
||||
// Method Description:
|
||||
// - Connects the PrivateSetDefaultBackground call directly into our Driver Message servicing
|
||||
// call inside Conhost.exe
|
||||
// Arguments:
|
||||
// - value: the new RGB value to use, as a COLORREF, format 0x00BBGGRR.
|
||||
// Return Value:
|
||||
// - true if successful (see DoSrvPrivateSetDefaultBackgroundColor). false otherwise.
|
||||
bool ConhostInternalGetSet::PrivateSetDefaultBackground(const COLORREF value) const noexcept
|
||||
{
|
||||
return SUCCEEDED(DoSrvPrivateSetDefaultBackgroundColor(value));
|
||||
}
|
||||
CATCH_RETURN_FALSE()
|
||||
|
||||
// Routine Description:
|
||||
// - Connects the PrivateFillRegion call directly into our Driver Message servicing
|
||||
|
|
|
@ -73,9 +73,8 @@ public:
|
|||
const SMALL_RECT& window) override;
|
||||
|
||||
bool SetInputMode(const Microsoft::Console::VirtualTerminal::TerminalInput::Mode mode, const bool enabled) override;
|
||||
bool SetParserMode(const Microsoft::Console::VirtualTerminal::StateMachine::Mode mode, const bool enabled) override;
|
||||
bool GetParserMode(const Microsoft::Console::VirtualTerminal::StateMachine::Mode mode) const override;
|
||||
|
||||
bool PrivateSetAnsiMode(const bool ansiMode) override;
|
||||
bool PrivateSetScreenMode(const bool reverseMode) override;
|
||||
bool PrivateSetAutoWrapMode(const bool wrapAtEOL) override;
|
||||
|
||||
|
@ -101,6 +100,7 @@ public:
|
|||
|
||||
bool GetUserDefaultCursorStyle(CursorType& style) override;
|
||||
bool SetCursorStyle(CursorType const style) override;
|
||||
bool SetCursorColor(COLORREF const color) override;
|
||||
|
||||
bool PrivateRefreshWindow() override;
|
||||
|
||||
|
@ -118,8 +118,12 @@ public:
|
|||
|
||||
bool MoveToBottom() const override;
|
||||
|
||||
COLORREF GetColorTableEntry(const size_t tableIndex) const noexcept override;
|
||||
bool SetColorTableEntry(const size_t tableIndex, const COLORREF color) noexcept override;
|
||||
bool PrivateGetColorTableEntry(const size_t index, COLORREF& value) const noexcept override;
|
||||
bool PrivateSetColorTableEntry(const size_t index, const COLORREF value) const noexcept override;
|
||||
|
||||
bool PrivateSetDefaultForeground(const COLORREF value) const noexcept override;
|
||||
|
||||
bool PrivateSetDefaultBackground(const COLORREF value) const noexcept override;
|
||||
|
||||
bool PrivateFillRegion(const COORD startPosition,
|
||||
const size_t fillLength,
|
||||
|
|
|
@ -110,6 +110,8 @@ void RenderData::UnlockConsole() noexcept
|
|||
const TextAttribute RenderData::GetDefaultBrushColors() noexcept
|
||||
{
|
||||
const CONSOLE_INFORMATION& gci = ServiceLocator::LocateGlobals().getConsoleInformation();
|
||||
_defaultForeground = gci.GetDefaultForeground();
|
||||
_defaultBackground = gci.GetDefaultBackground();
|
||||
return gci.GetActiveOutputBuffer().GetAttributes();
|
||||
}
|
||||
|
||||
|
@ -224,7 +226,8 @@ ULONG RenderData::GetCursorPixelWidth() const noexcept
|
|||
COLORREF RenderData::GetCursorColor() const noexcept
|
||||
{
|
||||
const CONSOLE_INFORMATION& gci = ServiceLocator::LocateGlobals().getConsoleInformation();
|
||||
return gci.GetColorTableEntry(TextColor::CURSOR_COLOR);
|
||||
const auto& cursor = gci.GetActiveOutputBuffer().GetTextBuffer().GetCursor();
|
||||
return cursor.GetColor();
|
||||
}
|
||||
|
||||
// Routine Description:
|
||||
|
@ -361,7 +364,7 @@ const std::vector<size_t> RenderData::GetPatternId(const COORD /*location*/) con
|
|||
std::pair<COLORREF, COLORREF> RenderData::GetAttributeColors(const TextAttribute& attr) const noexcept
|
||||
{
|
||||
const CONSOLE_INFORMATION& gci = ServiceLocator::LocateGlobals().getConsoleInformation();
|
||||
return gci.LookupAttributeColors(attr);
|
||||
return gci.LookupAttributeColors(attr, _defaultForeground, _defaultBackground);
|
||||
}
|
||||
#pragma endregion
|
||||
|
||||
|
|
|
@ -72,4 +72,8 @@ public:
|
|||
void ColorSelection(const COORD coordSelectionStart, const COORD coordSelectionEnd, const TextAttribute attr);
|
||||
const bool IsUiaDataInitialized() const noexcept override { return true; }
|
||||
#pragma endregion
|
||||
|
||||
private:
|
||||
COLORREF _defaultForeground = gsl::at(Microsoft::Console::Utils::CampbellColorTable(), 7);
|
||||
COLORREF _defaultBackground = gsl::at(Microsoft::Console::Utils::CampbellColorTable(), 0);
|
||||
};
|
||||
|
|
|
@ -123,6 +123,7 @@ SCREEN_INFORMATION::~SCREEN_INFORMATION()
|
|||
pScreen->_renderTarget);
|
||||
|
||||
const auto& gci = ServiceLocator::LocateGlobals().getConsoleInformation();
|
||||
pScreen->_textBuffer->GetCursor().SetColor(gci.GetCursorColor());
|
||||
pScreen->_textBuffer->GetCursor().SetType(gci.GetCursorType());
|
||||
|
||||
const NTSTATUS status = pScreen->_InitializeOutputStateMachine();
|
||||
|
@ -1629,6 +1630,29 @@ void SCREEN_INFORMATION::SetCursorInformation(const ULONG Size,
|
|||
}
|
||||
}
|
||||
|
||||
// Routine Description:
|
||||
// - This routine sets the cursor color. Also updates the cursor information of
|
||||
// this buffer's main buffer, if this buffer is an alt buffer.
|
||||
// Arguments:
|
||||
// - Color - The new color to set the cursor to
|
||||
// - setMain - If true, propagate change to main buffer as well.
|
||||
// Return Value:
|
||||
// - None
|
||||
void SCREEN_INFORMATION::SetCursorColor(const unsigned int Color, const bool setMain) noexcept
|
||||
{
|
||||
Cursor& cursor = _textBuffer->GetCursor();
|
||||
|
||||
cursor.SetColor(Color);
|
||||
|
||||
// If we're an alt buffer, DON'T propagate this setting up to the main buffer.
|
||||
// We don't want to pollute that buffer with this state,
|
||||
// UNLESS we're getting called from the propsheet, then we DO want to update this.
|
||||
if (_psiMainBuffer && setMain)
|
||||
{
|
||||
_psiMainBuffer->SetCursorColor(Color);
|
||||
}
|
||||
}
|
||||
|
||||
// Routine Description:
|
||||
// - This routine sets the cursor shape both in the data
|
||||
// structures and on the screen. Also updates the cursor information of
|
||||
|
@ -1884,7 +1908,7 @@ const SCREEN_INFORMATION& SCREEN_INFORMATION::GetMainBuffer() const
|
|||
auto& myCursor = GetTextBuffer().GetCursor();
|
||||
auto* const createdBuffer = *ppsiNewScreenBuffer;
|
||||
auto& altCursor = createdBuffer->GetTextBuffer().GetCursor();
|
||||
altCursor.SetStyle(myCursor.GetSize(), myCursor.GetType());
|
||||
altCursor.SetStyle(myCursor.GetSize(), myCursor.GetColor(), myCursor.GetType());
|
||||
altCursor.SetIsVisible(myCursor.IsVisible());
|
||||
altCursor.SetBlinkingAllowed(myCursor.IsBlinkingAllowed());
|
||||
// The new position should match the viewport-relative position of the main buffer.
|
||||
|
@ -1982,7 +2006,7 @@ void SCREEN_INFORMATION::UseMainScreenBuffer()
|
|||
// Copy the alt buffer's cursor style and visibility back to the main buffer.
|
||||
const auto& altCursor = psiAlt->GetTextBuffer().GetCursor();
|
||||
auto& mainCursor = psiMain->GetTextBuffer().GetCursor();
|
||||
mainCursor.SetStyle(altCursor.GetSize(), altCursor.GetType());
|
||||
mainCursor.SetStyle(altCursor.GetSize(), altCursor.GetColor(), altCursor.GetType());
|
||||
mainCursor.SetIsVisible(altCursor.IsVisible());
|
||||
mainCursor.SetBlinkingAllowed(altCursor.IsBlinkingAllowed());
|
||||
|
||||
|
|
|
@ -189,6 +189,8 @@ public:
|
|||
void SetCursorInformation(const ULONG Size,
|
||||
const bool Visible) noexcept;
|
||||
|
||||
void SetCursorColor(const unsigned int Color, const bool setMain = false) noexcept;
|
||||
|
||||
void SetCursorType(const CursorType Type, const bool setMain = false) noexcept;
|
||||
|
||||
void SetCursorDBMode(const bool DoubleCursor);
|
||||
|
|
|
@ -16,6 +16,7 @@ Selection::Selection() :
|
|||
_fSelectionVisible(false),
|
||||
_ulSavedCursorSize(0),
|
||||
_fSavedCursorVisible(false),
|
||||
_savedCursorColor(INVALID_COLOR),
|
||||
_savedCursorType(CursorType::Legacy),
|
||||
_dwSelectionFlags(0),
|
||||
_fLineSelection(true),
|
||||
|
|
|
@ -174,6 +174,7 @@ private:
|
|||
COORD _coordSavedCursorPosition;
|
||||
ULONG _ulSavedCursorSize;
|
||||
bool _fSavedCursorVisible;
|
||||
COLORREF _savedCursorColor;
|
||||
CursorType _savedCursorType;
|
||||
|
||||
#ifdef UNIT_TESTING
|
||||
|
|
|
@ -168,6 +168,7 @@ void Selection::_SaveCursorData(const Cursor& cursor) noexcept
|
|||
_coordSavedCursorPosition = cursor.GetPosition();
|
||||
_ulSavedCursorSize = cursor.GetSize();
|
||||
_fSavedCursorVisible = cursor.IsVisible();
|
||||
_savedCursorColor = cursor.GetColor();
|
||||
_savedCursorType = cursor.GetType();
|
||||
}
|
||||
|
||||
|
@ -181,6 +182,7 @@ void Selection::_RestoreDataToCursor(Cursor& cursor) noexcept
|
|||
{
|
||||
cursor.SetSize(_ulSavedCursorSize);
|
||||
cursor.SetIsVisible(_fSavedCursorVisible);
|
||||
cursor.SetColor(_savedCursorColor);
|
||||
cursor.SetType(_savedCursorType);
|
||||
cursor.SetIsOn(true);
|
||||
cursor.SetPosition(_coordSavedCursorPosition);
|
||||
|
|
|
@ -124,7 +124,10 @@ public:
|
|||
COOKED_READ_DATA& CookedReadData() noexcept;
|
||||
void SetCookedReadData(COOKED_READ_DATA* readData) noexcept;
|
||||
|
||||
COLORREF GetDefaultForeground() const noexcept;
|
||||
COLORREF GetDefaultBackground() const noexcept;
|
||||
std::pair<COLORREF, COLORREF> LookupAttributeColors(const TextAttribute& attr) const noexcept;
|
||||
std::pair<COLORREF, COLORREF> LookupAttributeColors(const TextAttribute& attr, const COLORREF defaultFg, const COLORREF defaultBg) const noexcept;
|
||||
|
||||
void SetTitle(const std::wstring_view newTitle);
|
||||
void SetTitlePrefix(const std::wstring_view newTitlePrefix);
|
||||
|
|
|
@ -56,8 +56,8 @@ Settings::Settings() :
|
|||
_fScreenReversed(false),
|
||||
// window size pixels initialized below
|
||||
_fInterceptCopyPaste(0),
|
||||
_defaultForegroundIndex(TextColor::DARK_WHITE),
|
||||
_defaultBackgroundIndex(TextColor::DARK_BLACK),
|
||||
_DefaultForeground(INVALID_COLOR),
|
||||
_DefaultBackground(INVALID_COLOR),
|
||||
_fUseDx(UseDx::Disabled),
|
||||
_fCopyColor(false)
|
||||
{
|
||||
|
@ -78,14 +78,11 @@ Settings::Settings() :
|
|||
ZeroMemory((void*)&_FaceName, sizeof(_FaceName));
|
||||
wcscpy_s(_FaceName, DEFAULT_TT_FONT_FACENAME);
|
||||
|
||||
_CursorColor = Cursor::s_InvertCursorColor;
|
||||
_CursorType = CursorType::Legacy;
|
||||
|
||||
gsl::span<COLORREF> tableView = { _colorTable.data(), _colorTable.size() };
|
||||
::Microsoft::Console::Utils::InitializeColorTable(tableView);
|
||||
|
||||
_colorTable.at(TextColor::DEFAULT_FOREGROUND) = INVALID_COLOR;
|
||||
_colorTable.at(TextColor::DEFAULT_BACKGROUND) = INVALID_COLOR;
|
||||
_colorTable.at(TextColor::CURSOR_COLOR) = INVALID_COLOR;
|
||||
}
|
||||
|
||||
// Routine Description:
|
||||
|
@ -232,11 +229,11 @@ void Settings::InitFromStateInfo(_In_ PCONSOLE_STATE_INFO pStateInfo)
|
|||
_fCtrlKeyShortcutsDisabled = pStateInfo->fCtrlKeyShortcutsDisabled;
|
||||
_bLineSelection = pStateInfo->fLineSelection;
|
||||
_bWindowAlpha = pStateInfo->bWindowTransparency;
|
||||
_CursorColor = pStateInfo->CursorColor;
|
||||
_CursorType = static_cast<CursorType>(pStateInfo->CursorType);
|
||||
_fInterceptCopyPaste = pStateInfo->InterceptCopyPaste;
|
||||
_colorTable.at(TextColor::DEFAULT_FOREGROUND) = pStateInfo->DefaultForeground;
|
||||
_colorTable.at(TextColor::DEFAULT_BACKGROUND) = pStateInfo->DefaultBackground;
|
||||
_colorTable.at(TextColor::CURSOR_COLOR) = pStateInfo->CursorColor;
|
||||
_DefaultForeground = pStateInfo->DefaultForeground;
|
||||
_DefaultBackground = pStateInfo->DefaultBackground;
|
||||
_TerminalScrolling = pStateInfo->TerminalScrolling;
|
||||
}
|
||||
|
||||
|
@ -277,11 +274,11 @@ CONSOLE_STATE_INFO Settings::CreateConsoleStateInfo() const
|
|||
csi.fCtrlKeyShortcutsDisabled = _fCtrlKeyShortcutsDisabled;
|
||||
csi.fLineSelection = _bLineSelection;
|
||||
csi.bWindowTransparency = _bWindowAlpha;
|
||||
csi.CursorColor = _CursorColor;
|
||||
csi.CursorType = static_cast<unsigned int>(_CursorType);
|
||||
csi.InterceptCopyPaste = _fInterceptCopyPaste;
|
||||
csi.DefaultForeground = _colorTable.at(TextColor::DEFAULT_FOREGROUND);
|
||||
csi.DefaultBackground = _colorTable.at(TextColor::DEFAULT_BACKGROUND);
|
||||
csi.CursorColor = _colorTable.at(TextColor::CURSOR_COLOR);
|
||||
csi.DefaultForeground = _DefaultForeground;
|
||||
csi.DefaultBackground = _DefaultBackground;
|
||||
csi.TerminalScrolling = _TerminalScrolling;
|
||||
return csi;
|
||||
}
|
||||
|
@ -333,22 +330,16 @@ void Settings::Validate()
|
|||
WI_ClearAllFlags(_wFillAttribute, ~(FG_ATTRS | BG_ATTRS));
|
||||
WI_ClearAllFlags(_wPopupFillAttribute, ~(FG_ATTRS | BG_ATTRS));
|
||||
|
||||
const auto defaultForeground = _colorTable.at(TextColor::DEFAULT_FOREGROUND);
|
||||
const auto defaultBackground = _colorTable.at(TextColor::DEFAULT_BACKGROUND);
|
||||
const auto cursorColor = _colorTable.at(TextColor::CURSOR_COLOR);
|
||||
|
||||
// If the extended color options are set to invalid values (all the same color), reset them.
|
||||
if (cursorColor != INVALID_COLOR && cursorColor == defaultBackground)
|
||||
if (_CursorColor != Cursor::s_InvertCursorColor && _CursorColor == _DefaultBackground)
|
||||
{
|
||||
// INVALID_COLOR is used to represent "Invert Colors"
|
||||
_colorTable.at(TextColor::CURSOR_COLOR) = INVALID_COLOR;
|
||||
_CursorColor = Cursor::s_InvertCursorColor;
|
||||
}
|
||||
|
||||
if (defaultForeground != INVALID_COLOR && defaultForeground == defaultBackground)
|
||||
if (_DefaultForeground != INVALID_COLOR && _DefaultForeground == _DefaultBackground)
|
||||
{
|
||||
// INVALID_COLOR is used as an "unset" sentinel in future attribute functions.
|
||||
_colorTable.at(TextColor::DEFAULT_FOREGROUND) = INVALID_COLOR;
|
||||
_colorTable.at(TextColor::DEFAULT_BACKGROUND) = INVALID_COLOR;
|
||||
_DefaultForeground = _DefaultBackground = INVALID_COLOR;
|
||||
// If the damaged settings _further_ propagated to the default fill attribute, fix it.
|
||||
if (_wFillAttribute == 0)
|
||||
{
|
||||
|
@ -360,8 +351,6 @@ void Settings::Validate()
|
|||
// At this point the default fill attributes are fully initialized
|
||||
// so we can pass on the final colors to the TextAttribute class.
|
||||
TextAttribute::SetLegacyDefaultAttributes(_wFillAttribute);
|
||||
// And calculate the position of the default colors in the color table.
|
||||
CalculateDefaultColorIndices();
|
||||
|
||||
FAIL_FAST_IF(!(_dwWindowSize.X > 0));
|
||||
FAIL_FAST_IF(!(_dwWindowSize.Y > 0));
|
||||
|
@ -771,11 +760,21 @@ COLORREF Settings::GetLegacyColorTableEntry(const size_t index) const
|
|||
return _colorTable.at(TextColor::TransposeLegacyIndex(index));
|
||||
}
|
||||
|
||||
COLORREF Settings::GetCursorColor() const noexcept
|
||||
{
|
||||
return _CursorColor;
|
||||
}
|
||||
|
||||
CursorType Settings::GetCursorType() const noexcept
|
||||
{
|
||||
return _CursorType;
|
||||
}
|
||||
|
||||
void Settings::SetCursorColor(const COLORREF CursorColor) noexcept
|
||||
{
|
||||
_CursorColor = CursorColor;
|
||||
}
|
||||
|
||||
void Settings::SetCursorType(const CursorType cursorType) noexcept
|
||||
{
|
||||
_CursorType = cursorType;
|
||||
|
@ -791,35 +790,24 @@ void Settings::SetInterceptCopyPaste(const bool interceptCopyPaste) noexcept
|
|||
_fInterceptCopyPaste = interceptCopyPaste;
|
||||
}
|
||||
|
||||
void Settings::CalculateDefaultColorIndices() noexcept
|
||||
COLORREF Settings::GetDefaultForegroundColor() const noexcept
|
||||
{
|
||||
const auto foregroundColor = _colorTable.at(TextColor::DEFAULT_FOREGROUND);
|
||||
const auto foregroundIndex = TextColor::TransposeLegacyIndex(_wFillAttribute & FG_ATTRS);
|
||||
_defaultForegroundIndex = foregroundColor != INVALID_COLOR ? TextColor::DEFAULT_FOREGROUND : foregroundIndex;
|
||||
|
||||
const auto backgroundColor = _colorTable.at(TextColor::DEFAULT_BACKGROUND);
|
||||
const auto backgroundIndex = TextColor::TransposeLegacyIndex((_wFillAttribute & BG_ATTRS) >> 4);
|
||||
_defaultBackgroundIndex = backgroundColor != INVALID_COLOR ? TextColor::DEFAULT_BACKGROUND : backgroundIndex;
|
||||
return _DefaultForeground;
|
||||
}
|
||||
|
||||
size_t Settings::GetDefaultForegroundIndex() const noexcept
|
||||
void Settings::SetDefaultForegroundColor(const COLORREF defaultForeground) noexcept
|
||||
{
|
||||
return _defaultForegroundIndex;
|
||||
_DefaultForeground = defaultForeground;
|
||||
}
|
||||
|
||||
void Settings::SetDefaultForegroundIndex(const size_t index) noexcept
|
||||
COLORREF Settings::GetDefaultBackgroundColor() const noexcept
|
||||
{
|
||||
_defaultForegroundIndex = index;
|
||||
return _DefaultBackground;
|
||||
}
|
||||
|
||||
size_t Settings::GetDefaultBackgroundIndex() const noexcept
|
||||
void Settings::SetDefaultBackgroundColor(const COLORREF defaultBackground) noexcept
|
||||
{
|
||||
return _defaultBackgroundIndex;
|
||||
}
|
||||
|
||||
void Settings::SetDefaultBackgroundIndex(const size_t index) noexcept
|
||||
{
|
||||
_defaultBackgroundIndex = index;
|
||||
_DefaultBackground = defaultBackground;
|
||||
}
|
||||
|
||||
bool Settings::IsTerminalScrolling() const noexcept
|
||||
|
|
|
@ -167,7 +167,7 @@ public:
|
|||
void SetHistoryNoDup(const bool fHistoryNoDup);
|
||||
|
||||
// The first 16 items of the color table are the same as the 16-color palette.
|
||||
inline const std::array<COLORREF, TextColor::TABLE_SIZE>& GetColorTable() const noexcept
|
||||
inline const std::array<COLORREF, XTERM_COLOR_TABLE_SIZE>& GetColorTable() const noexcept
|
||||
{
|
||||
return _colorTable;
|
||||
}
|
||||
|
@ -177,17 +177,20 @@ public:
|
|||
void SetLegacyColorTableEntry(const size_t index, const COLORREF ColorValue);
|
||||
COLORREF GetLegacyColorTableEntry(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;
|
||||
|
||||
void CalculateDefaultColorIndices() noexcept;
|
||||
size_t GetDefaultForegroundIndex() const noexcept;
|
||||
void SetDefaultForegroundIndex(const size_t index) noexcept;
|
||||
size_t GetDefaultBackgroundIndex() const noexcept;
|
||||
void SetDefaultBackgroundIndex(const size_t index) 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;
|
||||
|
@ -239,19 +242,20 @@ private:
|
|||
UseDx _fUseDx;
|
||||
bool _fCopyColor;
|
||||
|
||||
std::array<COLORREF, TextColor::TABLE_SIZE> _colorTable;
|
||||
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;
|
||||
|
||||
size_t _defaultForegroundIndex;
|
||||
size_t _defaultBackgroundIndex;
|
||||
|
||||
COLORREF _DefaultForeground;
|
||||
COLORREF _DefaultBackground;
|
||||
bool _TerminalScrolling;
|
||||
friend class RegistrySerialization;
|
||||
};
|
||||
|
|
|
@ -67,10 +67,9 @@ class ConptyOutputTests
|
|||
// Set up some sane defaults
|
||||
auto& g = ServiceLocator::LocateGlobals();
|
||||
auto& gci = g.getConsoleInformation();
|
||||
gci.SetColorTableEntry(TextColor::DEFAULT_FOREGROUND, INVALID_COLOR);
|
||||
gci.SetColorTableEntry(TextColor::DEFAULT_BACKGROUND, INVALID_COLOR);
|
||||
gci.SetDefaultForegroundColor(INVALID_COLOR);
|
||||
gci.SetDefaultBackgroundColor(INVALID_COLOR);
|
||||
gci.SetFillAttribute(0x07); // DARK_WHITE on DARK_BLACK
|
||||
gci.CalculateDefaultColorIndices();
|
||||
|
||||
m_state->PrepareNewTextBufferInfo(true, TerminalViewWidth, TerminalViewHeight);
|
||||
auto& currentBuffer = gci.GetActiveOutputBuffer();
|
||||
|
|
|
@ -59,10 +59,9 @@ class ScreenBufferTests
|
|||
{
|
||||
// Set up some sane defaults
|
||||
CONSOLE_INFORMATION& gci = ServiceLocator::LocateGlobals().getConsoleInformation();
|
||||
gci.SetColorTableEntry(TextColor::DEFAULT_FOREGROUND, INVALID_COLOR);
|
||||
gci.SetColorTableEntry(TextColor::DEFAULT_BACKGROUND, INVALID_COLOR);
|
||||
gci.SetDefaultForegroundColor(INVALID_COLOR);
|
||||
gci.SetDefaultBackgroundColor(INVALID_COLOR);
|
||||
gci.SetFillAttribute(0x07); // DARK_WHITE on DARK_BLACK
|
||||
gci.CalculateDefaultColorIndices();
|
||||
|
||||
m_state->PrepareNewTextBufferInfo();
|
||||
auto& currentBuffer = gci.GetActiveOutputBuffer();
|
||||
|
@ -360,11 +359,12 @@ void ScreenBufferTests::AlternateBufferCursorInheritanceTest()
|
|||
auto mainCursorPos = COORD{ 3, 5 };
|
||||
auto mainCursorVisible = false;
|
||||
auto mainCursorSize = 33u;
|
||||
auto mainCursorColor = RGB(1, 2, 3);
|
||||
auto mainCursorType = CursorType::DoubleUnderscore;
|
||||
auto mainCursorBlinking = false;
|
||||
mainCursor.SetPosition(mainCursorPos);
|
||||
mainCursor.SetIsVisible(mainCursorVisible);
|
||||
mainCursor.SetStyle(mainCursorSize, mainCursorType);
|
||||
mainCursor.SetStyle(mainCursorSize, mainCursorColor, mainCursorType);
|
||||
mainCursor.SetBlinkingAllowed(mainCursorBlinking);
|
||||
|
||||
Log::Comment(L"Switch to the alternate buffer.");
|
||||
|
@ -379,6 +379,7 @@ void ScreenBufferTests::AlternateBufferCursorInheritanceTest()
|
|||
VERIFY_ARE_EQUAL(mainCursorVisible, altCursor.IsVisible());
|
||||
Log::Comment(L"Confirm the cursor style is inherited from the main buffer.");
|
||||
VERIFY_ARE_EQUAL(mainCursorSize, altCursor.GetSize());
|
||||
VERIFY_ARE_EQUAL(mainCursorColor, altCursor.GetColor());
|
||||
VERIFY_ARE_EQUAL(mainCursorType, altCursor.GetType());
|
||||
VERIFY_ARE_EQUAL(mainCursorBlinking, altCursor.IsBlinkingAllowed());
|
||||
|
||||
|
@ -386,11 +387,12 @@ void ScreenBufferTests::AlternateBufferCursorInheritanceTest()
|
|||
auto altCursorPos = COORD{ 5, 3 };
|
||||
auto altCursorVisible = true;
|
||||
auto altCursorSize = 66u;
|
||||
auto altCursorColor = RGB(3, 2, 1);
|
||||
auto altCursorType = CursorType::EmptyBox;
|
||||
auto altCursorBlinking = true;
|
||||
altCursor.SetPosition(altCursorPos);
|
||||
altCursor.SetIsVisible(altCursorVisible);
|
||||
altCursor.SetStyle(altCursorSize, altCursorType);
|
||||
altCursor.SetStyle(altCursorSize, altCursorColor, altCursorType);
|
||||
altCursor.SetBlinkingAllowed(altCursorBlinking);
|
||||
|
||||
Log::Comment(L"Switch back to the main buffer.");
|
||||
|
@ -404,6 +406,7 @@ void ScreenBufferTests::AlternateBufferCursorInheritanceTest()
|
|||
VERIFY_ARE_EQUAL(altCursorVisible, mainCursor.IsVisible());
|
||||
Log::Comment(L"Confirm the cursor style is inherited from the alt buffer.");
|
||||
VERIFY_ARE_EQUAL(altCursorSize, mainCursor.GetSize());
|
||||
VERIFY_ARE_EQUAL(altCursorColor, mainCursor.GetColor());
|
||||
VERIFY_ARE_EQUAL(altCursorType, mainCursor.GetType());
|
||||
VERIFY_ARE_EQUAL(altCursorBlinking, mainCursor.IsBlinkingAllowed());
|
||||
}
|
||||
|
@ -1385,9 +1388,8 @@ void ScreenBufferTests::VtScrollMarginsNewlineColor()
|
|||
|
||||
const COLORREF yellow = RGB(255, 255, 0);
|
||||
const COLORREF magenta = RGB(255, 0, 255);
|
||||
gci.SetColorTableEntry(TextColor::DEFAULT_FOREGROUND, yellow);
|
||||
gci.SetColorTableEntry(TextColor::DEFAULT_BACKGROUND, magenta);
|
||||
gci.CalculateDefaultColorIndices();
|
||||
gci.SetDefaultForegroundColor(yellow);
|
||||
gci.SetDefaultBackgroundColor(magenta);
|
||||
const TextAttribute defaultAttrs = {};
|
||||
si.SetAttributes(defaultAttrs);
|
||||
|
||||
|
@ -1739,6 +1741,7 @@ void ScreenBufferTests::ResizeCursorUnchanged()
|
|||
// Get initial cursor values
|
||||
const CursorType initialType = initialCursor.GetType();
|
||||
const auto initialSize = initialCursor.GetSize();
|
||||
const COLORREF initialColor = initialCursor.GetColor();
|
||||
|
||||
// set our wrap mode accordingly - ResizeScreenBuffer will be smart enough
|
||||
// to call the appropriate implementation
|
||||
|
@ -1753,8 +1756,10 @@ void ScreenBufferTests::ResizeCursorUnchanged()
|
|||
const auto& finalCursor = si.GetTextBuffer().GetCursor();
|
||||
const CursorType finalType = finalCursor.GetType();
|
||||
const auto finalSize = finalCursor.GetSize();
|
||||
const COLORREF finalColor = finalCursor.GetColor();
|
||||
|
||||
VERIFY_ARE_EQUAL(initialType, finalType);
|
||||
VERIFY_ARE_EQUAL(initialColor, finalColor);
|
||||
VERIFY_ARE_EQUAL(initialSize, finalSize);
|
||||
}
|
||||
|
||||
|
@ -2117,6 +2122,7 @@ void ScreenBufferTests::TestAltBufferCursorState()
|
|||
// Validate that the cursor state was copied appropriately into the
|
||||
// alternate buffer
|
||||
VERIFY_ARE_EQUAL(mainCursor.GetSize(), altCursor.GetSize());
|
||||
VERIFY_ARE_EQUAL(mainCursor.GetColor(), altCursor.GetColor());
|
||||
VERIFY_ARE_EQUAL(mainCursor.GetType(), altCursor.GetType());
|
||||
}
|
||||
}
|
||||
|
@ -2253,9 +2259,8 @@ void ScreenBufferTests::SetDefaultsIndividuallyBothDefault()
|
|||
COLORREF brightGreen = gci.GetColorTableEntry(TextColor::BRIGHT_GREEN);
|
||||
COLORREF darkBlue = gci.GetColorTableEntry(TextColor::DARK_BLUE);
|
||||
|
||||
gci.SetColorTableEntry(TextColor::DEFAULT_FOREGROUND, yellow);
|
||||
gci.SetColorTableEntry(TextColor::DEFAULT_BACKGROUND, magenta);
|
||||
gci.CalculateDefaultColorIndices();
|
||||
gci.SetDefaultForegroundColor(yellow);
|
||||
gci.SetDefaultBackgroundColor(magenta);
|
||||
si.SetDefaultAttributes({}, TextAttribute{ gci.GetPopupFillAttribute() });
|
||||
|
||||
Log::Comment(NoThrowString().Format(L"Write 6 X's:"));
|
||||
|
@ -2356,9 +2361,8 @@ void ScreenBufferTests::SetDefaultsTogether()
|
|||
COLORREF yellow = RGB(255, 255, 0);
|
||||
COLORREF color250 = gci.GetColorTableEntry(250);
|
||||
|
||||
gci.SetColorTableEntry(TextColor::DEFAULT_FOREGROUND, yellow);
|
||||
gci.SetColorTableEntry(TextColor::DEFAULT_BACKGROUND, magenta);
|
||||
gci.CalculateDefaultColorIndices();
|
||||
gci.SetDefaultForegroundColor(yellow);
|
||||
gci.SetDefaultBackgroundColor(magenta);
|
||||
si.SetDefaultAttributes({}, TextAttribute{ gci.GetPopupFillAttribute() });
|
||||
|
||||
Log::Comment(NoThrowString().Format(L"Write 6 X's:"));
|
||||
|
@ -2428,9 +2432,8 @@ void ScreenBufferTests::ReverseResetWithDefaultBackground()
|
|||
|
||||
COLORREF magenta = RGB(255, 0, 255);
|
||||
|
||||
gci.SetColorTableEntry(TextColor::DEFAULT_FOREGROUND, INVALID_COLOR);
|
||||
gci.SetColorTableEntry(TextColor::DEFAULT_BACKGROUND, magenta);
|
||||
gci.CalculateDefaultColorIndices();
|
||||
gci.SetDefaultForegroundColor(INVALID_COLOR);
|
||||
gci.SetDefaultBackgroundColor(magenta);
|
||||
si.SetDefaultAttributes({}, TextAttribute{ gci.GetPopupFillAttribute() });
|
||||
|
||||
Log::Comment(NoThrowString().Format(L"Write 3 X's:"));
|
||||
|
@ -2498,8 +2501,7 @@ void ScreenBufferTests::BackspaceDefaultAttrs()
|
|||
|
||||
COLORREF magenta = RGB(255, 0, 255);
|
||||
|
||||
gci.SetColorTableEntry(TextColor::DEFAULT_BACKGROUND, magenta);
|
||||
gci.CalculateDefaultColorIndices();
|
||||
gci.SetDefaultBackgroundColor(magenta);
|
||||
si.SetDefaultAttributes({}, TextAttribute{ gci.GetPopupFillAttribute() });
|
||||
|
||||
Log::Comment(NoThrowString().Format(L"Write 2 X's, then backspace one."));
|
||||
|
@ -2562,8 +2564,7 @@ void ScreenBufferTests::BackspaceDefaultAttrsWriteCharsLegacy()
|
|||
|
||||
COLORREF magenta = RGB(255, 0, 255);
|
||||
|
||||
gci.SetColorTableEntry(TextColor::DEFAULT_BACKGROUND, magenta);
|
||||
gci.CalculateDefaultColorIndices();
|
||||
gci.SetDefaultBackgroundColor(magenta);
|
||||
si.SetDefaultAttributes({}, TextAttribute{ gci.GetPopupFillAttribute() });
|
||||
|
||||
Log::Comment(NoThrowString().Format(L"Write 2 X's, then backspace one."));
|
||||
|
@ -2631,8 +2632,7 @@ void ScreenBufferTests::BackspaceDefaultAttrsInPrompt()
|
|||
|
||||
COLORREF magenta = RGB(255, 0, 255);
|
||||
|
||||
gci.SetColorTableEntry(TextColor::DEFAULT_BACKGROUND, magenta);
|
||||
gci.CalculateDefaultColorIndices();
|
||||
gci.SetDefaultBackgroundColor(magenta);
|
||||
si.SetDefaultAttributes({}, TextAttribute{ gci.GetPopupFillAttribute() });
|
||||
TextAttribute expectedDefaults{};
|
||||
|
||||
|
@ -2889,15 +2889,15 @@ void ScreenBufferTests::SetDefaultForegroundColor()
|
|||
|
||||
StateMachine& stateMachine = mainBuffer.GetStateMachine();
|
||||
|
||||
COLORREF originalColor = gci.GetColorTableEntry(TextColor::DEFAULT_FOREGROUND);
|
||||
COLORREF newColor = gci.GetColorTableEntry(TextColor::DEFAULT_FOREGROUND);
|
||||
COLORREF originalColor = gci.GetDefaultForegroundColor();
|
||||
COLORREF newColor = gci.GetDefaultForegroundColor();
|
||||
COLORREF testColor = RGB(0x33, 0x66, 0x99);
|
||||
VERIFY_ARE_NOT_EQUAL(originalColor, testColor);
|
||||
|
||||
Log::Comment(L"Valid Hexadecimal Notation");
|
||||
stateMachine.ProcessString(L"\x1b]10;rgb:33/66/99\x1b\\");
|
||||
|
||||
newColor = gci.GetColorTableEntry(TextColor::DEFAULT_FOREGROUND);
|
||||
newColor = gci.GetDefaultForegroundColor();
|
||||
VERIFY_ARE_EQUAL(testColor, newColor);
|
||||
|
||||
Log::Comment(L"Valid Hexadecimal Notation");
|
||||
|
@ -2905,7 +2905,7 @@ void ScreenBufferTests::SetDefaultForegroundColor()
|
|||
testColor = RGB(0xff, 0xff, 0xff);
|
||||
stateMachine.ProcessString(L"\x1b]10;rgb:ff/ff/ff\x1b\\");
|
||||
|
||||
newColor = gci.GetColorTableEntry(TextColor::DEFAULT_FOREGROUND);
|
||||
newColor = gci.GetDefaultForegroundColor();
|
||||
VERIFY_ARE_EQUAL(testColor, newColor);
|
||||
|
||||
Log::Comment(L"Invalid syntax");
|
||||
|
@ -2913,7 +2913,7 @@ void ScreenBufferTests::SetDefaultForegroundColor()
|
|||
testColor = RGB(153, 102, 51);
|
||||
stateMachine.ProcessString(L"\x1b]10;99/66/33\x1b\\");
|
||||
|
||||
newColor = gci.GetColorTableEntry(TextColor::DEFAULT_FOREGROUND);
|
||||
newColor = gci.GetDefaultForegroundColor();
|
||||
VERIFY_ARE_NOT_EQUAL(testColor, newColor);
|
||||
// it will, in fact leave the color the way it was
|
||||
VERIFY_ARE_EQUAL(originalColor, newColor);
|
||||
|
@ -2934,15 +2934,15 @@ void ScreenBufferTests::SetDefaultBackgroundColor()
|
|||
|
||||
StateMachine& stateMachine = mainBuffer.GetStateMachine();
|
||||
|
||||
COLORREF originalColor = gci.GetColorTableEntry(TextColor::DEFAULT_BACKGROUND);
|
||||
COLORREF newColor = gci.GetColorTableEntry(TextColor::DEFAULT_BACKGROUND);
|
||||
COLORREF originalColor = gci.GetDefaultBackgroundColor();
|
||||
COLORREF newColor = gci.GetDefaultBackgroundColor();
|
||||
COLORREF testColor = RGB(0x33, 0x66, 0x99);
|
||||
VERIFY_ARE_NOT_EQUAL(originalColor, testColor);
|
||||
|
||||
Log::Comment(L"Valid Hexadecimal Notation");
|
||||
stateMachine.ProcessString(L"\x1b]11;rgb:33/66/99\x1b\\");
|
||||
|
||||
newColor = gci.GetColorTableEntry(TextColor::DEFAULT_BACKGROUND);
|
||||
newColor = gci.GetDefaultBackgroundColor();
|
||||
VERIFY_ARE_EQUAL(testColor, newColor);
|
||||
|
||||
Log::Comment(L"Valid Hexadecimal Notation");
|
||||
|
@ -2950,7 +2950,7 @@ void ScreenBufferTests::SetDefaultBackgroundColor()
|
|||
testColor = RGB(0xff, 0xff, 0xff);
|
||||
stateMachine.ProcessString(L"\x1b]11;rgb:ff/ff/ff\x1b\\");
|
||||
|
||||
newColor = gci.GetColorTableEntry(TextColor::DEFAULT_BACKGROUND);
|
||||
newColor = gci.GetDefaultBackgroundColor();
|
||||
VERIFY_ARE_EQUAL(testColor, newColor);
|
||||
|
||||
Log::Comment(L"Invalid Syntax");
|
||||
|
@ -2958,7 +2958,7 @@ void ScreenBufferTests::SetDefaultBackgroundColor()
|
|||
testColor = RGB(153, 102, 51);
|
||||
stateMachine.ProcessString(L"\x1b]11;99/66/33\x1b\\");
|
||||
|
||||
newColor = gci.GetColorTableEntry(TextColor::DEFAULT_BACKGROUND);
|
||||
newColor = gci.GetDefaultBackgroundColor();
|
||||
VERIFY_ARE_NOT_EQUAL(testColor, newColor);
|
||||
// it will, in fact leave the color the way it was
|
||||
VERIFY_ARE_EQUAL(originalColor, newColor);
|
||||
|
@ -5978,7 +5978,7 @@ void ScreenBufferTests::TestAddHyperlink()
|
|||
auto& stateMachine = si.GetStateMachine();
|
||||
|
||||
// Process the opening osc 8 sequence with no custom id
|
||||
stateMachine.ProcessString(L"\x1b]8;;test.url\x1b\\");
|
||||
stateMachine.ProcessString(L"\x1b]8;;test.url\x9c");
|
||||
VERIFY_IS_TRUE(tbi.GetCurrentAttributes().IsHyperlink());
|
||||
VERIFY_ARE_EQUAL(tbi.GetHyperlinkUriFromId(tbi.GetCurrentAttributes().GetHyperlinkId()), L"test.url");
|
||||
|
||||
|
@ -5988,7 +5988,7 @@ void ScreenBufferTests::TestAddHyperlink()
|
|||
VERIFY_ARE_EQUAL(tbi.GetHyperlinkUriFromId(tbi.GetCurrentAttributes().GetHyperlinkId()), L"test.url");
|
||||
|
||||
// Process the closing osc 8 sequences
|
||||
stateMachine.ProcessString(L"\x1b]8;;\x1b\\");
|
||||
stateMachine.ProcessString(L"\x1b]8;;\x9c");
|
||||
VERIFY_IS_FALSE(tbi.GetCurrentAttributes().IsHyperlink());
|
||||
}
|
||||
|
||||
|
@ -6001,7 +6001,7 @@ void ScreenBufferTests::TestAddHyperlinkCustomId()
|
|||
auto& stateMachine = si.GetStateMachine();
|
||||
|
||||
// Process the opening osc 8 sequence with a custom id
|
||||
stateMachine.ProcessString(L"\x1b]8;id=myId;test.url\x1b\\");
|
||||
stateMachine.ProcessString(L"\x1b]8;id=myId;test.url\x9c");
|
||||
VERIFY_IS_TRUE(tbi.GetCurrentAttributes().IsHyperlink());
|
||||
VERIFY_ARE_EQUAL(tbi.GetHyperlinkUriFromId(tbi.GetCurrentAttributes().GetHyperlinkId()), L"test.url");
|
||||
VERIFY_ARE_EQUAL(tbi.GetHyperlinkId(L"test.url", L"myId"), tbi.GetCurrentAttributes().GetHyperlinkId());
|
||||
|
@ -6013,7 +6013,7 @@ void ScreenBufferTests::TestAddHyperlinkCustomId()
|
|||
VERIFY_ARE_EQUAL(tbi.GetHyperlinkId(L"test.url", L"myId"), tbi.GetCurrentAttributes().GetHyperlinkId());
|
||||
|
||||
// Process the closing osc 8 sequences
|
||||
stateMachine.ProcessString(L"\x1b]8;;\x1b\\");
|
||||
stateMachine.ProcessString(L"\x1b]8;;\x9c");
|
||||
VERIFY_IS_FALSE(tbi.GetCurrentAttributes().IsHyperlink());
|
||||
}
|
||||
|
||||
|
@ -6026,7 +6026,7 @@ void ScreenBufferTests::TestAddHyperlinkCustomIdDifferentUri()
|
|||
auto& stateMachine = si.GetStateMachine();
|
||||
|
||||
// Process the opening osc 8 sequence with a custom id
|
||||
stateMachine.ProcessString(L"\x1b]8;id=myId;test.url\x1b\\");
|
||||
stateMachine.ProcessString(L"\x1b]8;id=myId;test.url\x9c");
|
||||
VERIFY_IS_TRUE(tbi.GetCurrentAttributes().IsHyperlink());
|
||||
VERIFY_ARE_EQUAL(tbi.GetHyperlinkUriFromId(tbi.GetCurrentAttributes().GetHyperlinkId()), L"test.url");
|
||||
VERIFY_ARE_EQUAL(tbi.GetHyperlinkId(L"test.url", L"myId"), tbi.GetCurrentAttributes().GetHyperlinkId());
|
||||
|
@ -6034,7 +6034,7 @@ void ScreenBufferTests::TestAddHyperlinkCustomIdDifferentUri()
|
|||
const auto oldAttributes{ tbi.GetCurrentAttributes() };
|
||||
|
||||
// Send any other text
|
||||
stateMachine.ProcessString(L"\x1b]8;id=myId;other.url\x1b\\");
|
||||
stateMachine.ProcessString(L"\x1b]8;id=myId;other.url\x9c");
|
||||
VERIFY_IS_TRUE(tbi.GetCurrentAttributes().IsHyperlink());
|
||||
VERIFY_ARE_EQUAL(tbi.GetHyperlinkUriFromId(tbi.GetCurrentAttributes().GetHyperlinkId()), L"other.url");
|
||||
VERIFY_ARE_EQUAL(tbi.GetHyperlinkId(L"other.url", L"myId"), tbi.GetCurrentAttributes().GetHyperlinkId());
|
||||
|
|
|
@ -37,3 +37,4 @@ enum class CursorType : unsigned int
|
|||
constexpr COLORREF INVALID_COLOR = 0xffffffff;
|
||||
|
||||
constexpr WORD COLOR_TABLE_SIZE = 16;
|
||||
constexpr WORD XTERM_COLOR_TABLE_SIZE = 256;
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue