Skip to content

Commit

Permalink
Trying to fix application unresponsive when wrapping consecutive long…
Browse files Browse the repository at this point in the history
  • Loading branch information
zufuliu committed Aug 29, 2020
1 parent 963345b commit 6d81c09
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 18 deletions.
20 changes: 13 additions & 7 deletions scintilla/src/Document.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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<Sci::Line>(static_cast<Sci::Line>(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;
Expand Down
9 changes: 5 additions & 4 deletions scintilla/src/Document.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
};

/**
Expand Down
10 changes: 3 additions & 7 deletions scintilla/src/Editor.cxx
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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<Sci::Line>(
static_cast<Sci::Line>(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());
Expand Down Expand Up @@ -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<int>(secondsAllowed / pdoc->durationStyleOneLine.Duration()),
10, 0x10000);
const Sci::Line stylingMaxLine = std::min(
pdoc->SciLineFromPosition(pdoc->GetEndStyled()) + linesToStyle,
pdoc->LinesTotal());
Expand Down

0 comments on commit 6d81c09

Please sign in to comment.