summaryrefslogtreecommitdiff
path: root/src/select.cc
diff options
context:
space:
mode:
authorStefano Zacchiroli <zack@upsilon.cc>2014-10-13 23:15:23 +0200
committerMartin Michlmayr <tbm@cyrius.com>2014-10-13 17:15:56 -0400
commit56976a127c081a6a008c81966360003a8711a319 (patch)
treeb27188861374e243746aaf561a0a9cf480989fbb /src/select.cc
parent6b2520cc49edf4d167bec10850b832c308ebf9a3 (diff)
downloadfork-ledger-56976a127c081a6a008c81966360003a8711a319.tar.gz
fork-ledger-56976a127c081a6a008c81966360003a8711a319.tar.bz2
fork-ledger-56976a127c081a6a008c81966360003a8711a319.zip
make --columns default to terminal width, as returned by ioctl()
If set, the COLUMNS environment variable will take precedence over terminal width. However, please note that COLUMNS is usually *not* exported by shells to child processes, so in most cases COLUMNS will be undefined for ledger---hence the motivation for this change. Terminal width is queried using ioctl() on stdin. For the sake of portability the querying is done only on platform where ioctl() is detected as supported at compile-time.
Diffstat (limited to 'src/select.cc')
-rw-r--r--src/select.cc7
1 files changed, 7 insertions, 0 deletions
diff --git a/src/select.cc b/src/select.cc
index 45ae34be..a9e943ab 100644
--- a/src/select.cc
+++ b/src/select.cc
@@ -145,10 +145,17 @@ value_t select_command(call_scope_t& args)
string thus_far = "";
std::size_t cols = 0;
+#if HAVE_IOCTL
+ struct winsize ws;
+#endif
if (report.HANDLED(columns_))
cols = lexical_cast<std::size_t>(report.HANDLER(columns_).value);
else if (const char * columns_env = std::getenv("COLUMNS"))
cols = lexical_cast<std::size_t>(columns_env);
+#if HAVE_IOCTL
+ else if (ioctl(STDIN_FILENO, TIOCGWINSZ, &ws) != -1)
+ cols = ws.ws_col;
+#endif
else
cols = 80;