From f0d125f35a4e0177d14c9bc1703508df1c3b4dbf Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Thu, 4 Jul 2024 17:54:26 +0200 Subject: [PATCH] Core: Prefer to split text chunks in OutputWindow at line breaks We want to minimize backtracking in OutputFormatter. Change-Id: I114472d761ddbf0a2c3e6b42c87a531206fb1473 Reviewed-by: David Schulz --- src/plugins/coreplugin/outputwindow.cpp | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/plugins/coreplugin/outputwindow.cpp b/src/plugins/coreplugin/outputwindow.cpp index 9bf8b35e095..6117917b0e1 100644 --- a/src/plugins/coreplugin/outputwindow.cpp +++ b/src/plugins/coreplugin/outputwindow.cpp @@ -416,12 +416,24 @@ void OutputWindow::handleNextOutputChunk() { QTC_ASSERT(!d->queuedOutput.isEmpty(), return); auto &chunk = d->queuedOutput.first(); - if (chunk.first.size() <= chunkSize) { + + // We want to break off the chunks along line breaks, if possible. + // Otherwise we can get ugly temporary artifacts e.g. for ANSI escape codes. + int actualChunkSize = std::min(chunkSize, int(chunk.first.size())); + const int minEndPos = std::max(0, actualChunkSize - 1000); + for (int i = actualChunkSize - 1; i >= minEndPos; --i) { + if (chunk.first.at(i) == '\n') { + actualChunkSize = i + 1; + break; + } + } + + if (actualChunkSize == chunk.first.size()) { handleOutputChunk(chunk.first, chunk.second); d->queuedOutput.removeFirst(); } else { - handleOutputChunk(chunk.first.left(chunkSize), chunk.second); - chunk.first.remove(0, chunkSize); + handleOutputChunk(chunk.first.left(actualChunkSize), chunk.second); + chunk.first.remove(0, actualChunkSize); } if (!d->queuedOutput.isEmpty()) d->queueTimer.start();