diff options
author | Sylvain Joubert <joubert.sy@gmail.com> | 2020-04-06 13:42:24 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2020-04-08 18:40:09 (GMT) |
commit | 60bfaa8fe61fe65b706a304ce4e48f85c13f7c15 (patch) | |
tree | c0db033c7015ab6e2d782b33ce72f19ca285b8a3 /Source/CursesDialog/cmCursesMainForm.cxx | |
parent | e9b36731e957456cee5ef43e8f80d6cf8bedde96 (diff) | |
download | CMake-60bfaa8fe61fe65b706a304ce4e48f85c13f7c15.zip CMake-60bfaa8fe61fe65b706a304ce4e48f85c13f7c15.tar.gz CMake-60bfaa8fe61fe65b706a304ce4e48f85c13f7c15.tar.bz2 |
ccmake: Use incremental rendering for the logs
This should avoid an exponential slowdown in the display time for
projects with lots of output.
This is still slower than cmake due to the ncurses drawing, but it should
now be O(L) in total and not O(L^2) wrt to output length.
Fixes: #20535
Diffstat (limited to 'Source/CursesDialog/cmCursesMainForm.cxx')
-rw-r--r-- | Source/CursesDialog/cmCursesMainForm.cxx | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/Source/CursesDialog/cmCursesMainForm.cxx b/Source/CursesDialog/cmCursesMainForm.cxx index 2c92835..65376d1 100644 --- a/Source/CursesDialog/cmCursesMainForm.cxx +++ b/Source/CursesDialog/cmCursesMainForm.cxx @@ -453,11 +453,11 @@ void cmCursesMainForm::UpdateProgress(const std::string& msg, float prog) this->LastProgress.append(progressBarCompleted, '#'); this->LastProgress.append(progressBarWidth - progressBarCompleted, ' '); this->LastProgress += "] " + msg + "..."; + this->DisplayOutputs(std::string()); } else { this->Outputs.emplace_back(msg); + this->DisplayOutputs(msg); } - - this->DisplayOutputs(); } int cmCursesMainForm::Configure(int noconfigure) @@ -589,7 +589,7 @@ void cmCursesMainForm::AddError(const std::string& message, { this->Outputs.emplace_back(message); this->HasNonStatusOutputs = true; - this->DisplayOutputs(); + this->DisplayOutputs(message); } void cmCursesMainForm::RemoveEntry(const char* value) @@ -995,18 +995,22 @@ void cmCursesMainForm::ResetOutputs() this->LastProgress.clear(); } -void cmCursesMainForm::DisplayOutputs() +void cmCursesMainForm::DisplayOutputs(std::string const& newOutput) { int xi; int yi; getmaxyx(stdscr, yi, xi); - auto newLogForm = new cmCursesLongMessageForm( - this->Outputs, this->LastProgress.c_str(), - cmCursesLongMessageForm::ScrollBehavior::ScrollDown); - CurrentForm = newLogForm; - this->LogForm.reset(newLogForm); - this->LogForm->Render(1, 1, xi, yi); + if (CurrentForm != this->LogForm.get()) { + auto newLogForm = new cmCursesLongMessageForm( + this->Outputs, this->LastProgress.c_str(), + cmCursesLongMessageForm::ScrollBehavior::ScrollDown); + CurrentForm = newLogForm; + this->LogForm.reset(newLogForm); + this->LogForm->Render(1, 1, xi, yi); + } else { + this->LogForm->UpdateContent(newOutput, this->LastProgress); + } } const char* cmCursesMainForm::s_ConstHelpMessage = |