From 2b7b8ef5a9d52d4e64594efff998a42399a29466 Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Tue, 26 Nov 2024 09:08:36 +0100 Subject: [PATCH] Terminal: Fix "flicker" while searching Previously the search results would be removed every time the terminal updates before the new hits were resolved. This patch fixed that by keeping the old hits until the new hits are found. To not keep old hits around when the terminal is cleared a signal is introduced that the SearchableTerminal can connect to and clear its Hits immediately. Fixes: QTCREATORBUG-32066 Change-Id: If0bcf133098f06df53b52aae9b1036f0bc58870d Reviewed-by: Cristian Adam --- .../solutions/terminal/terminalsurface.cpp | 1 + src/libs/solutions/terminal/terminalsurface.h | 1 + src/libs/solutions/terminal/terminalview.cpp | 1 + src/libs/solutions/terminal/terminalview.h | 3 +++ .../terminal/searchableterminal.cpp | 23 +++++++++++++------ .../coreplugin/terminal/searchableterminal.h | 1 + 6 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/libs/solutions/terminal/terminalsurface.cpp b/src/libs/solutions/terminal/terminalsurface.cpp index 0c6d88f62ec..40dc2809c0d 100644 --- a/src/libs/solutions/terminal/terminalsurface.cpp +++ b/src/libs/solutions/terminal/terminalsurface.cpp @@ -120,6 +120,7 @@ struct TerminalSurfacePrivate }; m_vtermScreenCallbacks.sb_clear = [](void *user) { auto p = static_cast(user); + emit p->q->cleared(); return p->sb_clear(); }; m_vtermScreenCallbacks.bell = [](void *user) { diff --git a/src/libs/solutions/terminal/terminalsurface.h b/src/libs/solutions/terminal/terminalsurface.h index a8cc12fa4b0..6700156da9b 100644 --- a/src/libs/solutions/terminal/terminalsurface.h +++ b/src/libs/solutions/terminal/terminalsurface.h @@ -111,6 +111,7 @@ signals: void cursorChanged(Cursor oldCursor, Cursor newCursor); void altscreenChanged(bool altScreen); void unscroll(); + void cleared(); private: std::unique_ptr d; diff --git a/src/libs/solutions/terminal/terminalview.cpp b/src/libs/solutions/terminal/terminalview.cpp index 7ed75159a54..1010e546d97 100644 --- a/src/libs/solutions/terminal/terminalview.cpp +++ b/src/libs/solutions/terminal/terminalview.cpp @@ -176,6 +176,7 @@ TerminalSurface *TerminalView::surface() const void TerminalView::setupSurface() { d->m_surface = std::make_unique(QSize{80, 60}); + connect(d->m_surface.get(), &TerminalSurface::cleared, this, &TerminalView::cleared); if (d->m_surfaceIntegration) d->m_surface->setSurfaceIntegration(d->m_surfaceIntegration); diff --git a/src/libs/solutions/terminal/terminalview.h b/src/libs/solutions/terminal/terminalview.h index 6e0c55d06f8..fcc5994a75e 100644 --- a/src/libs/solutions/terminal/terminalview.h +++ b/src/libs/solutions/terminal/terminalview.h @@ -224,6 +224,9 @@ protected: private: void scheduleViewportUpdate(); +signals: + void cleared(); + private: std::unique_ptr d; }; diff --git a/src/plugins/coreplugin/terminal/searchableterminal.cpp b/src/plugins/coreplugin/terminal/searchableterminal.cpp index 5022be6b19c..66626523464 100644 --- a/src/plugins/coreplugin/terminal/searchableterminal.cpp +++ b/src/plugins/coreplugin/terminal/searchableterminal.cpp @@ -47,6 +47,18 @@ void TerminalSearch::setSearchString(const QString &searchString, FindFlags find } } +void TerminalSearch::clearAndSearchAgain() +{ + if (!m_hits.isEmpty()) { + m_hits.clear(); + m_currentHit = -1; + emit hitsChanged(); + emit currentHitChanged(); + } + + m_debounceTimer.start(); +} + void TerminalSearch::nextHit() { if (m_hits.isEmpty()) @@ -67,13 +79,6 @@ void TerminalSearch::previousHit() void TerminalSearch::updateHits() { - if (!m_hits.isEmpty()) { - m_hits.clear(); - m_currentHit = -1; - emit hitsChanged(); - emit currentHitChanged(); - } - m_debounceTimer.start(); } @@ -282,6 +287,10 @@ SearchableTerminal::SearchableTerminal(QWidget *parent) m_aggregate->add(this); surfaceChanged(); + + connect(this, &TerminalSolution::TerminalView::cleared, this, [this] { + m_search->clearAndSearchAgain(); + }); } SearchableTerminal::~SearchableTerminal() = default; diff --git a/src/plugins/coreplugin/terminal/searchableterminal.h b/src/plugins/coreplugin/terminal/searchableterminal.h index d1747fd99b2..958dac3bac0 100644 --- a/src/plugins/coreplugin/terminal/searchableterminal.h +++ b/src/plugins/coreplugin/terminal/searchableterminal.h @@ -25,6 +25,7 @@ public: void setCurrentSelection(std::optional selection); void setSearchString(const QString &searchString, Utils::FindFlags findFlags); + void clearAndSearchAgain(); void nextHit(); void previousHit();