Handle wrapping of potentially long lines

This commit is contained in:
Jack Grigg 2016-09-04 15:40:28 +12:00
parent 0ddd6d1cd8
commit db853f8a46
No known key found for this signature in database
GPG Key ID: 6A6914DAFBEA00DA
1 changed files with 16 additions and 6 deletions

View File

@ -12,6 +12,7 @@
#include <boost/thread.hpp> #include <boost/thread.hpp>
#include <boost/thread/synchronized_value.hpp> #include <boost/thread/synchronized_value.hpp>
#include <string> #include <string>
#include <sys/ioctl.h>
AtomicCounter transactionsValidated; AtomicCounter transactionsValidated;
AtomicCounter ehSolverRuns; AtomicCounter ehSolverRuns;
@ -80,7 +81,7 @@ void printMiningStatus(bool mining)
std::cout << std::endl; std::cout << std::endl;
} }
int printMetrics(int64_t nStart, bool mining) int printMetrics(size_t cols, int64_t nStart, bool mining)
{ {
// Number of lines that are always displayed // Number of lines that are always displayed
int lines = 3; int lines = 3;
@ -103,7 +104,9 @@ int printMetrics(int64_t nStart, bool mining)
} else { } else {
duration = strprintf(_("%d seconds"), seconds); duration = strprintf(_("%d seconds"), seconds);
} }
std::cout << strprintf(_("Since starting this node %s ago:"), duration) << std::endl; std::string strDuration = strprintf(_("Since starting this node %s ago:"), duration);
std::cout << strDuration << std::endl;
lines += (strDuration.size() / cols);
std::cout << "- " << strprintf(_("You have validated %d transactions."), transactionsValidated.get()) << std::endl; std::cout << "- " << strprintf(_("You have validated %d transactions."), transactionsValidated.get()) << std::endl;
@ -122,7 +125,7 @@ int printMetrics(int64_t nStart, bool mining)
return lines; return lines;
} }
int printMessageBox() int printMessageBox(size_t cols)
{ {
boost::strict_lock_ptr<std::list<std::string>> u = messageBox.synchronize(); boost::strict_lock_ptr<std::list<std::string>> u = messageBox.synchronize();
@ -130,12 +133,15 @@ int printMessageBox()
return 0; return 0;
} }
int lines = 2 + u->size();
std::cout << _("Messages:") << std::endl; std::cout << _("Messages:") << std::endl;
for (auto it = u->cbegin(); it != u->cend(); ++it) { for (auto it = u->cbegin(); it != u->cend(); ++it) {
std::cout << *it << std::endl; std::cout << *it << std::endl;
// Handle wrapped lines
lines += (it->size() / cols);
} }
std::cout << std::endl; std::cout << std::endl;
return 2 + u->size(); return lines;
} }
int printInitMessage() int printInitMessage()
@ -183,11 +189,15 @@ void ThreadShowMetricsScreen()
// Number of lines that are always displayed // Number of lines that are always displayed
int lines = 1; int lines = 1;
// Get current window size
struct winsize w;
ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);
// Erase below current position // Erase below current position
std::cout << "\e[J"; std::cout << "\e[J";
lines += printMetrics(nStart, mining); lines += printMetrics(w.ws_col, nStart, mining);
lines += printMessageBox(); lines += printMessageBox(w.ws_col);
lines += printInitMessage(); lines += printInitMessage();
// Explain how to exit // Explain how to exit