Fix conpty cursor movement detection on double-width lines (#17233)

When the VT render engine checks whether the cursor has moved in the
`InvalidateCursor` method, it does so by comparing the origin of the
given cursor region with the last text output coordinates. But these two
values are actually from different coordinate systems, and when on a
double-width line, the x text coordinate is half of the corresponding
screen coordinate. As a result, the movement detection is sometimes
incorrect.

This PR fixes the issue by adding another field to track the last cursor
origin in screen coordinates, so we have a meaningful value to compare
against.

## References and Relevant Issues

The previous cursor movement detection was added in PR #17194 to fix
issue #17117.

## Validation Steps Performed

I've confirmed that the test case from issue #17232 is now fixed, and
the test case from issue #17117 is still working as expected.

## PR Checklist
- [x] Closes #17232
This commit is contained in:
James Holderness 2024-05-10 01:42:38 +01:00 committed by GitHub
parent 44516ad7cf
commit 34ecc5bf23
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 3 additions and 1 deletions

View File

@ -75,7 +75,8 @@ CATCH_RETURN();
}
_skipCursor = false;
_cursorMoved = psrRegion->origin() != _lastText;
_cursorMoved = psrRegion->origin() != _lastCursorOrigin;
_lastCursorOrigin = psrRegion->origin();
return S_OK;
}

View File

@ -111,6 +111,7 @@ namespace Microsoft::Console::Render
til::pmr::bitmap _invalidMap;
til::point _lastText;
til::point _lastCursorOrigin;
til::point _scrollDelta;
bool _clearedAllThisFrame;