From 926a2e3d800a18a23139f8c6e9f97f3ccf63650c Mon Sep 17 00:00:00 2001 From: Chester Liu Date: Sat, 19 Oct 2019 05:03:32 +0800 Subject: [PATCH] Fix cursor redrawing crash (#2965) * Added read lock and fix various cursor pos issue --- src/cascadia/TerminalCore/Terminal.cpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/cascadia/TerminalCore/Terminal.cpp b/src/cascadia/TerminalCore/Terminal.cpp index 2d7dd5d424d..d58ca2fb032 100644 --- a/src/cascadia/TerminalCore/Terminal.cpp +++ b/src/cascadia/TerminalCore/Terminal.cpp @@ -178,6 +178,18 @@ void Terminal::UpdateSettings(winrt::Microsoft::Terminal::Settings::ICoreSetting proposedTop -= (proposedBottom - bufferSize.Y); } + Cursor& cursor = _buffer->GetCursor(); + auto cursorPosition = cursor.GetPosition(); + + // If the cursor is positioned beyond the range of the viewport, then + // set the cursor position to a legal value. + cursorPosition.X = std::min(cursorPosition.X, static_cast(viewportSize.X - 1)); + cursorPosition.Y = std::min(cursorPosition.Y, static_cast(viewportSize.Y - 1)); + + cursor.StartDeferDrawing(); + cursor.SetPosition(cursorPosition); + cursor.EndDeferDrawing(); + _mutableViewport = Viewport::FromDimensions({ 0, proposedTop }, viewportSize); _scrollOffset = 0; _NotifyScrollEvent(); @@ -425,6 +437,11 @@ void Terminal::_WriteBuffer(const std::wstring_view& stringView) } } + if (proposedCursorPosition.X > bufferSize.RightInclusive()) + { + proposedCursorPosition.X = 0; + } + // If we're about to scroll past the bottom of the buffer, instead cycle the buffer. const auto newRows = proposedCursorPosition.Y - bufferSize.Height() + 1; if (newRows > 0) @@ -533,6 +550,8 @@ void Terminal::_InitializeColorTable() // - isVisible: whether the cursor should be visible void Terminal::SetCursorVisible(const bool isVisible) noexcept { + auto lock = LockForWriting(); + auto& cursor = _buffer->GetCursor(); cursor.SetIsVisible(isVisible); }