forked from qt-creator/qt-creator
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>
This commit is contained in:
@@ -45,8 +45,6 @@ struct TerminalSurfacePrivate
|
|||||||
|
|
||||||
m_vtermScreenCallbacks.damage = [](VTermRect rect, void *user) {
|
m_vtermScreenCallbacks.damage = [](VTermRect rect, void *user) {
|
||||||
auto p = static_cast<TerminalSurfacePrivate *>(user);
|
auto p = static_cast<TerminalSurfacePrivate *>(user);
|
||||||
rect.start_row += p->m_scrollback->size();
|
|
||||||
rect.end_row += p->m_scrollback->size();
|
|
||||||
p->invalidate(rect);
|
p->invalidate(rect);
|
||||||
return 1;
|
return 1;
|
||||||
};
|
};
|
||||||
@@ -165,6 +163,11 @@ struct TerminalSurfacePrivate
|
|||||||
// Callbacks from vterm
|
// Callbacks from vterm
|
||||||
void invalidate(VTermRect rect)
|
void invalidate(VTermRect rect)
|
||||||
{
|
{
|
||||||
|
if (!m_altscreen) {
|
||||||
|
rect.start_row += m_scrollback->size();
|
||||||
|
rect.end_row += m_scrollback->size();
|
||||||
|
}
|
||||||
|
|
||||||
emit q->invalidated(
|
emit q->invalidated(
|
||||||
QRect{QPoint{rect.start_col, rect.start_row}, QPoint{rect.end_col, rect.end_row - 1}});
|
QRect{QPoint{rect.start_col, rect.start_row}, QPoint{rect.end_col, rect.end_row - 1}});
|
||||||
}
|
}
|
||||||
@@ -215,14 +218,12 @@ struct TerminalSurfacePrivate
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case VTERM_PROP_ICONNAME:
|
case VTERM_PROP_ICONNAME:
|
||||||
//emit iconTextChanged(val->string);
|
|
||||||
break;
|
break;
|
||||||
case VTERM_PROP_TITLE:
|
case VTERM_PROP_TITLE:
|
||||||
break;
|
break;
|
||||||
case VTERM_PROP_ALTSCREEN:
|
case VTERM_PROP_ALTSCREEN:
|
||||||
m_altscreen = val->boolean;
|
m_altscreen = val->boolean;
|
||||||
emit q->altscreenChanged(m_altscreen);
|
emit q->altscreenChanged(m_altscreen);
|
||||||
//setSelection(std::nullopt);
|
|
||||||
break;
|
break;
|
||||||
case VTERM_PROP_MOUSE:
|
case VTERM_PROP_MOUSE:
|
||||||
qCDebug(log) << "Ignoring VTERM_PROP_MOUSE" << val->number;
|
qCDebug(log) << "Ignoring VTERM_PROP_MOUSE" << val->number;
|
||||||
@@ -248,9 +249,9 @@ struct TerminalSurfacePrivate
|
|||||||
const VTermScreenCell *cellAt(int x, int y)
|
const VTermScreenCell *cellAt(int x, int y)
|
||||||
{
|
{
|
||||||
QTC_ASSERT(y >= 0 && x >= 0, return nullptr);
|
QTC_ASSERT(y >= 0 && x >= 0, return nullptr);
|
||||||
QTC_ASSERT(y < liveSize().height() + m_scrollback->size() && x < liveSize().width(),
|
QTC_ASSERT(y < q->fullSize().height() && x < liveSize().width(), return nullptr);
|
||||||
return nullptr);
|
|
||||||
if (y < m_scrollback->size()) {
|
if (!m_altscreen && y < m_scrollback->size()) {
|
||||||
const auto &sbl = m_scrollback->line((m_scrollback->size() - 1) - y);
|
const auto &sbl = m_scrollback->line((m_scrollback->size() - 1) - y);
|
||||||
if (x < sbl.cols()) {
|
if (x < sbl.cols()) {
|
||||||
return sbl.cell(x);
|
return sbl.cell(x);
|
||||||
@@ -258,7 +259,8 @@ struct TerminalSurfacePrivate
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
y -= m_scrollback->size();
|
if (!m_altscreen)
|
||||||
|
y -= m_scrollback->size();
|
||||||
|
|
||||||
static VTermScreenCell refCell{};
|
static VTermScreenCell refCell{};
|
||||||
VTermPos vtp{y, x};
|
VTermPos vtp{y, x};
|
||||||
@@ -306,6 +308,8 @@ QSize TerminalSurface::liveSize() const
|
|||||||
|
|
||||||
QSize TerminalSurface::fullSize() const
|
QSize TerminalSurface::fullSize() const
|
||||||
{
|
{
|
||||||
|
if (d->m_altscreen)
|
||||||
|
return liveSize();
|
||||||
return QSize{d->liveSize().width(), d->liveSize().height() + d->m_scrollback->size()};
|
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};
|
emptyCell{1, {}, {}, false, {}, std::nullopt, QTextCharFormat::NoUnderline, false};
|
||||||
|
|
||||||
QTC_ASSERT(y >= 0, return emptyCell);
|
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);
|
const VTermScreenCell *refCell = d->cellAt(x, y);
|
||||||
if (!refCell)
|
if (!refCell)
|
||||||
@@ -466,7 +470,8 @@ void TerminalSurface::sendKey(QKeyEvent *event)
|
|||||||
Cursor TerminalSurface::cursor() const
|
Cursor TerminalSurface::cursor() const
|
||||||
{
|
{
|
||||||
Cursor cursor = d->m_cursor;
|
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;
|
return cursor;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -278,6 +278,8 @@ void TerminalWidget::setupSurface()
|
|||||||
configBlinkTimer();
|
configBlinkTimer();
|
||||||
});
|
});
|
||||||
connect(m_surface.get(), &Internal::TerminalSurface::altscreenChanged, this, [this] {
|
connect(m_surface.get(), &Internal::TerminalSurface::altscreenChanged, this, [this] {
|
||||||
|
updateScrollBars();
|
||||||
|
updateViewport();
|
||||||
setSelection(std::nullopt);
|
setSelection(std::nullopt);
|
||||||
});
|
});
|
||||||
connect(m_surface.get(), &Internal::TerminalSurface::unscroll, this, [this] {
|
connect(m_surface.get(), &Internal::TerminalSurface::unscroll, this, [this] {
|
||||||
|
|||||||
Reference in New Issue
Block a user