diff options
author | Marcus Tillmanns <marcus.tillmanns@qt.io> | 2023-03-06 18:16:28 +0100 |
---|---|---|
committer | Marcus Tillmanns <marcus.tillmanns@qt.io> | 2023-03-09 19:57:08 +0000 |
commit | b95c0d247d1c89ca60c724c95201e3d410b5a318 (patch) | |
tree | 6954eb0c11010ed56d87e0385c4e9b892ee137ab /src | |
parent | 9b4e0c62fd8b43232d5255670a05340887057f1f (diff) | |
download | qt-creator-b95c0d247d1c89ca60c724c95201e3d410b5a318.tar.gz |
Terminal: Fix "altscreen" handling
When "altscreen" is enabled ( e.g. when starting nano ), the terminal
switches into an alternate mode without scrollback buffer.
This was not correctly handled where the scrollback buffer would stay
active.
Change-Id: I443d26383d9cd908befcd24a837ecf84c0c1e849
Reviewed-by: Cristian Adam <cristian.adam@qt.io>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/terminal/terminalsurface.cpp | 25 | ||||
-rw-r--r-- | src/plugins/terminal/terminalwidget.cpp | 2 |
2 files changed, 17 insertions, 10 deletions
diff --git a/src/plugins/terminal/terminalsurface.cpp b/src/plugins/terminal/terminalsurface.cpp index 4c9021d596..eb95215f94 100644 --- a/src/plugins/terminal/terminalsurface.cpp +++ b/src/plugins/terminal/terminalsurface.cpp @@ -45,8 +45,6 @@ struct TerminalSurfacePrivate m_vtermScreenCallbacks.damage = [](VTermRect rect, void *user) { auto p = static_cast<TerminalSurfacePrivate *>(user); - rect.start_row += p->m_scrollback->size(); - rect.end_row += p->m_scrollback->size(); p->invalidate(rect); return 1; }; @@ -165,6 +163,11 @@ struct TerminalSurfacePrivate // Callbacks from vterm void invalidate(VTermRect rect) { + if (!m_altscreen) { + rect.start_row += m_scrollback->size(); + rect.end_row += m_scrollback->size(); + } + emit q->invalidated( QRect{QPoint{rect.start_col, rect.start_row}, QPoint{rect.end_col, rect.end_row - 1}}); } @@ -215,14 +218,12 @@ struct TerminalSurfacePrivate break; } case VTERM_PROP_ICONNAME: - //emit iconTextChanged(val->string); break; case VTERM_PROP_TITLE: break; case VTERM_PROP_ALTSCREEN: m_altscreen = val->boolean; emit q->altscreenChanged(m_altscreen); - //setSelection(std::nullopt); break; case VTERM_PROP_MOUSE: qCDebug(log) << "Ignoring VTERM_PROP_MOUSE" << val->number; @@ -248,9 +249,9 @@ struct TerminalSurfacePrivate const VTermScreenCell *cellAt(int x, int y) { QTC_ASSERT(y >= 0 && x >= 0, return nullptr); - QTC_ASSERT(y < liveSize().height() + m_scrollback->size() && x < liveSize().width(), - return nullptr); - if (y < m_scrollback->size()) { + QTC_ASSERT(y < q->fullSize().height() && x < liveSize().width(), return nullptr); + + if (!m_altscreen && y < m_scrollback->size()) { const auto &sbl = m_scrollback->line((m_scrollback->size() - 1) - y); if (x < sbl.cols()) { return sbl.cell(x); @@ -258,7 +259,8 @@ struct TerminalSurfacePrivate return nullptr; } - y -= m_scrollback->size(); + if (!m_altscreen) + y -= m_scrollback->size(); static VTermScreenCell refCell{}; VTermPos vtp{y, x}; @@ -306,6 +308,8 @@ QSize TerminalSurface::liveSize() const QSize TerminalSurface::fullSize() const { + if (d->m_altscreen) + return liveSize(); return QSize{d->liveSize().width(), d->liveSize().height() + d->m_scrollback->size()}; } @@ -329,7 +333,7 @@ TerminalCell TerminalSurface::fetchCell(int x, int y) const emptyCell{1, {}, {}, false, {}, std::nullopt, QTextCharFormat::NoUnderline, false}; QTC_ASSERT(y >= 0, return emptyCell); - QTC_ASSERT(y < d->liveSize().height() + d->m_scrollback->size(), return emptyCell); + QTC_ASSERT(y < fullSize().height() && x < fullSize().width(), return emptyCell); const VTermScreenCell *refCell = d->cellAt(x, y); if (!refCell) @@ -466,7 +470,8 @@ void TerminalSurface::sendKey(QKeyEvent *event) Cursor TerminalSurface::cursor() const { Cursor cursor = d->m_cursor; - cursor.position.setY(cursor.position.y() + d->m_scrollback->size()); + if (!d->m_altscreen) + cursor.position.setY(cursor.position.y() + d->m_scrollback->size()); return cursor; } diff --git a/src/plugins/terminal/terminalwidget.cpp b/src/plugins/terminal/terminalwidget.cpp index 8df6e3c02a..b40110e653 100644 --- a/src/plugins/terminal/terminalwidget.cpp +++ b/src/plugins/terminal/terminalwidget.cpp @@ -278,6 +278,8 @@ void TerminalWidget::setupSurface() configBlinkTimer(); }); connect(m_surface.get(), &Internal::TerminalSurface::altscreenChanged, this, [this] { + updateScrollBars(); + updateViewport(); setSelection(std::nullopt); }); connect(m_surface.get(), &Internal::TerminalSurface::unscroll, this, [this] { |