diff --git a/src/cascadia/TerminalCore/Terminal.cpp b/src/cascadia/TerminalCore/Terminal.cpp index 2d7dd5d424d..93e62947f41 100644 --- a/src/cascadia/TerminalCore/Terminal.cpp +++ b/src/cascadia/TerminalCore/Terminal.cpp @@ -178,6 +178,21 @@ void Terminal::UpdateSettings(winrt::Microsoft::Terminal::Settings::ICoreSetting proposedTop -= (proposedBottom - bufferSize.Y); } + Cursor& cursor = _buffer->GetCursor(); + auto cursorPosition = cursor.GetPosition(); + if (cursorPosition.X > viewportSize.X) + { + cursorPosition.X = viewportSize.X - 1; + } + if (cursorPosition.Y > viewportSize.Y) + { + cursorPosition.Y = viewportSize.Y; + } + + cursor.StartDeferDrawing(); + cursor.SetPosition(cursorPosition); + cursor.EndDeferDrawing(); + _mutableViewport = Viewport::FromDimensions({ 0, proposedTop }, viewportSize); _scrollOffset = 0; _NotifyScrollEvent(); @@ -425,6 +440,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 +553,8 @@ void Terminal::_InitializeColorTable() // - isVisible: whether the cursor should be visible void Terminal::SetCursorVisible(const bool isVisible) noexcept { + auto lock = LockForReading(); + auto& cursor = _buffer->GetCursor(); cursor.SetIsVisible(isVisible); }