Preserve active attributes during VT resize operations #15269
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Summary of the Pull Request
When the screen is resized in ConHost via a VT escape sequence, the
active text attributes could end up being corrupted if they were set to
something that the legacy console APIs didn't support (e.g. RGB colors).
This PR fixes that issue.
Detailed Description of the Pull Request / Additional comments
The way a resize is implemented is by retrieving the buffer information
with
GetConsoleScreenBufferInfoEx
, updating the size fields, and thenwriting the data back out again with
SetConsoleScreenBufferInfoEx
.However, this also results in the active attributes being updated via
the
wAttributes
field, and that's only capable of representing legacyconsole attributes.
We address this by saving the full
TextAttribute
value before it getscorrupted in the
SetConsoleScreenBufferInfoEx
call, and then restoreit again afterwards.
Validation Steps Performed
I've added a unit test to verify the attributes are correctly preserved
for all VT resize operations, and I've also manually confirmed the test
case in #2540 is now working as expected.
PR Checklist