summaryrefslogtreecommitdiffstats
path: root/disk-utils/cfdisk.c
diff options
context:
space:
mode:
authorKarel Zak2015-07-27 15:29:37 +0200
committerKarel Zak2015-07-27 15:29:37 +0200
commited99eac0e2a83a315c7cf5d8a461df16b3106596 (patch)
tree7c72879c011c70844a16a07f4512bbfb25412221 /disk-utils/cfdisk.c
parentlibsmartcols: reduce relative columns more aggressively (diff)
downloadkernel-qcow2-util-linux-ed99eac0e2a83a315c7cf5d8a461df16b3106596.tar.gz
kernel-qcow2-util-linux-ed99eac0e2a83a315c7cf5d8a461df16b3106596.tar.xz
kernel-qcow2-util-linux-ed99eac0e2a83a315c7cf5d8a461df16b3106596.zip
cfdisk: make sure that output fits to terminal width
Reported-by: Benno Schulenberg <bensberg@justemail.net> Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'disk-utils/cfdisk.c')
-rw-r--r--disk-utils/cfdisk.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/disk-utils/cfdisk.c b/disk-utils/cfdisk.c
index e3eeab58b..aca1f9cff 100644
--- a/disk-utils/cfdisk.c
+++ b/disk-utils/cfdisk.c
@@ -497,12 +497,23 @@ static int lines_refresh(struct cfdisk *cf)
cf->lines = xcalloc(cf->nlines, sizeof(struct cfdisk_line));
for (p = cf->linesbuf, i = 0; p && i < cf->nlines; i++) {
- cf->lines[i].data = p;
- p = strchr(p, '\n');
+ char *begin = p;
+ size_t sz;
+
+ cf->lines[i].data = begin;
+ p = strchr(begin, '\n');
+ sz = p ? (size_t) (p - begin) : strlen(begin);
if (p) {
*p = '\0';
p++;
}
+ /* libsmartcols reduces columns width as much as possible to
+ * fit terminal width, but for very small terminals it preffers
+ * long lines rather than remove columns from output. This is fine
+ * for normal utils, but it's problematic for ncurses -- so we
+ * manually cut the end of the line to fit terminal width. */
+ if (sz + ARROW_CURSOR_WIDTH > ui_cols)
+ *(begin + (ui_cols - ARROW_CURSOR_WIDTH)) = '\0';
cf->lines[i].extra = scols_new_table();
scols_table_enable_noheadings(cf->lines[i].extra, 1);
scols_table_new_column(cf->lines[i].extra, NULL, 0, SCOLS_FL_RIGHT);