summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeremy Kerr <jk@ozlabs.org>2016-12-14 12:20:53 +0800
committerSamuel Mendoza-Jonas <sam@mendozajonas.com>2016-12-20 16:40:21 +1100
commitba14fc8ec91b54be57fdf2ca373e3d140ae2b6d6 (patch)
treef32dbd642cd1d31cbe1ef08662c37fe6007ea447
parentf59937ad2d75b89d5e5129717f28338d26bae3c7 (diff)
downloadpetitboot-ba14fc8ec91b54be57fdf2ca373e3d140ae2b6d6.zip
petitboot-ba14fc8ec91b54be57fdf2ca373e3d140ae2b6d6.tar.gz
ui/ncurses/text-screen: trim long lines
When a text_screen is given a long line, it'll wrap to the next, overstepping the left margin. We already have folded text for flowed text screens, so just trim long lines at the correct column. This exposes an off-by-one with the automatic wrapping in text_screen_set_text(), where we may overrun the last char, so fix that too. Signed-off-by: Jeremy Kerr <jk@ozlabs.org> Signed-off-by: Samuel Mendoza-Jonas <sam@mendozajonas.com>
-rw-r--r--ui/ncurses/nc-textscreen.c17
1 files changed, 10 insertions, 7 deletions
diff --git a/ui/ncurses/nc-textscreen.c b/ui/ncurses/nc-textscreen.c
index 55428e7..a460188 100644
--- a/ui/ncurses/nc-textscreen.c
+++ b/ui/ncurses/nc-textscreen.c
@@ -41,14 +41,15 @@ struct text_screen *text_screen_from_scr(struct nc_scr *scr)
void text_screen_draw(struct text_screen *screen)
{
- int max_y, i;
+ int max_y, max_x, i;
max_y = getmaxy(screen->scr.sub_ncw);
+ max_x = getmaxx(screen->scr.sub_ncw) - 1;
max_y = min(max_y, screen->scroll_y + screen->n_lines);
for (i = screen->scroll_y; i < max_y; i++)
- mvwaddstr(screen->scr.sub_ncw, i, 1, screen->lines[i]);
+ mvwaddnstr(screen->scr.sub_ncw, i, 1, screen->lines[i], max_x);
wrefresh(screen->scr.sub_ncw);
}
@@ -56,6 +57,7 @@ void text_screen_draw(struct text_screen *screen)
static void text_screen_scroll(struct text_screen *screen, int key)
{
int win_lines = getmaxy(screen->scr.sub_ncw);
+ int win_cols = getmaxx(screen->scr.sub_ncw) - 1;
int delta;
if (key == KEY_UP)
@@ -74,11 +76,12 @@ static void text_screen_scroll(struct text_screen *screen, int key)
wscrl(screen->scr.sub_ncw, delta);
if (delta > 0) {
- mvwaddstr(screen->scr.sub_ncw, win_lines - 1, 1,
- screen->lines[screen->scroll_y+win_lines-1]);
+ mvwaddnstr(screen->scr.sub_ncw, win_lines - 1, 1,
+ screen->lines[screen->scroll_y+win_lines-1],
+ win_cols);
} else if (delta < 0) {
- mvwaddstr(screen->scr.sub_ncw, 0, 1,
- screen->lines[screen->scroll_y]);
+ mvwaddnstr(screen->scr.sub_ncw, 0, 1,
+ screen->lines[screen->scroll_y], win_cols);
}
wrefresh(screen->scr.sub_ncw);
@@ -135,7 +138,7 @@ static int text_screen_fold_cb(void *arg, const char *buf, int len)
void text_screen_set_text(struct text_screen *screen, const char *text)
{
- fold_text(text, getmaxx(screen->scr.sub_ncw), text_screen_fold_cb,
+ fold_text(text, getmaxx(screen->scr.sub_ncw) - 1, text_screen_fold_cb,
screen);
}
OpenPOWER on IntegriCloud