From 6d81c09cca199b5eb10b7e7b5b2fdc97de711892 Mon Sep 17 00:00:00 2001 From: zufuliu Date: Sat, 29 Aug 2020 08:18:56 +0800 Subject: [PATCH] Trying to fix application unresponsive when wrapping consecutive long lines, issue #234. See https://sourceforge.net/p/scintilla/feature-requests/1373/ --- scintilla/src/Document.cxx | 20 +++++++++++++------- scintilla/src/Document.h | 9 +++++---- scintilla/src/Editor.cxx | 10 +++------- 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/scintilla/src/Document.cxx b/scintilla/src/Document.cxx index 1067f116db..aefc65cbe0 100644 --- a/scintilla/src/Document.cxx +++ b/scintilla/src/Document.cxx @@ -84,9 +84,9 @@ int LexInterface::LineEndTypesSupported() const noexcept { return 0; } -ActionDuration::ActionDuration(double duration_, double minDuration_, double maxDuration_) noexcept : - duration(duration_), minDuration(minDuration_), maxDuration(maxDuration_) { -} +//ActionDuration::ActionDuration(double duration_, double minDuration_, double maxDuration_) noexcept : +// duration(duration_), minDuration(minDuration_), maxDuration(maxDuration_) { +//} void ActionDuration::AddSample(size_t numberActions, double durationOfActions) noexcept { // Only adjust for multiple actions to avoid instability @@ -98,17 +98,23 @@ void ActionDuration::AddSample(size_t numberActions, double durationOfActions) n constexpr double alpha = 0.25; const double durationOne = durationOfActions / numberActions; - duration = std::clamp(alpha * durationOne + (1.0 - alpha) * duration, - minDuration, maxDuration); + const double duration_ = alpha * durationOne + (1.0 - alpha) * duration; + //duration = std::clamp(duration_, minDuration, maxDuration); + duration = std::max(duration_, minDuration); + //printf("%s actions=%zu, one=%.9f, value=%.9f, [%.9f, %f, %f]\n", __func__, + // numberActions, durationOne, duration_, duration, minDuration, maxDuration); } double ActionDuration::Duration() const noexcept { return duration; } +Sci::Line ActionDuration::LinesInAllowedTime(double secondsAllowed) const noexcept { + return std::clamp(static_cast(secondsAllowed / duration), 8, 0x10000); +} + Document::Document(int options) : - cb((options & SC_DOCUMENTOPTION_STYLES_NONE) == 0, (options & SC_DOCUMENTOPTION_TEXT_LARGE) != 0), - durationStyleOneLine(0.00001, 0.000001, 0.0001) { + cb((options & SC_DOCUMENTOPTION_STYLES_NONE) == 0, (options & SC_DOCUMENTOPTION_TEXT_LARGE) != 0) { refCount = 0; #ifdef _WIN32 eolMode = SC_EOL_CRLF; diff --git a/scintilla/src/Document.h b/scintilla/src/Document.h index 65a23e2726..d87864ac8e 100644 --- a/scintilla/src/Document.h +++ b/scintilla/src/Document.h @@ -198,13 +198,14 @@ struct RegexError : public std::runtime_error { */ class ActionDuration { - double duration; - const double minDuration; - const double maxDuration; + double duration = 1e-5; + static constexpr double minDuration = 1e-6; + static constexpr double maxDuration = 1e-4; public: - ActionDuration(double duration_, double minDuration_, double maxDuration_) noexcept; + //ActionDuration(double duration_, double minDuration_, double maxDuration_) noexcept; void AddSample(size_t numberActions, double durationOfActions) noexcept; double Duration() const noexcept; + Sci::Line LinesInAllowedTime(double secondsAllowed) const noexcept; }; /** diff --git a/scintilla/src/Editor.cxx b/scintilla/src/Editor.cxx index a82aa0d9c1..ef225e82b9 100644 --- a/scintilla/src/Editor.cxx +++ b/scintilla/src/Editor.cxx @@ -109,7 +109,7 @@ static constexpr bool IsAllSpacesOrTabs(std::string_view sv) noexcept { return true; } -Editor::Editor() : durationWrapOneLine(0.00001, 0.000001, 0.0001) { +Editor::Editor() { ctrlID = 0; stylesValid = false; @@ -1553,9 +1553,7 @@ bool Editor::WrapLines(WrapScope ws) { } else if (ws == WrapScope::wsIdle) { // Try to keep time taken by wrapping reasonable so interaction remains smooth. constexpr double secondsAllowed = 0.01; - const Sci::Line linesInAllowedTime = std::clamp( - static_cast(secondsAllowed / durationWrapOneLine.Duration()), - LinesOnScreen() + 50, 0x10000); + const Sci::Line linesInAllowedTime = durationWrapOneLine.LinesInAllowedTime(secondsAllowed); lineToWrapEnd = lineToWrap + linesInAllowedTime; } const Sci::Line lineEndNeedWrap = std::min(wrapPending.end, pdoc->LinesTotal()); @@ -5116,10 +5114,8 @@ Sci::Position Editor::PositionAfterMaxStyling(Sci::Position posMax, bool scrolli // Try to keep time taken by styling reasonable so interaction remains smooth. // When scrolling, allow less time to ensure responsive const double secondsAllowed = scrolling ? 0.005 : 0.02; + const Sci::Line linesToStyle = pdoc->durationStyleOneLine.LinesInAllowedTime(secondsAllowed); - const Sci::Line linesToStyle = std::clamp( - static_cast(secondsAllowed / pdoc->durationStyleOneLine.Duration()), - 10, 0x10000); const Sci::Line stylingMaxLine = std::min( pdoc->SciLineFromPosition(pdoc->GetEndStyled()) + linesToStyle, pdoc->LinesTotal());