diff options
author | Jeremy Kerr <jk@ozlabs.org> | 2013-12-09 11:52:57 +0800 |
---|---|---|
committer | Jeremy Kerr <jk@ozlabs.org> | 2014-01-31 08:46:34 +0800 |
commit | 702f9c313dea66817cf05196d84cd07889e80c51 (patch) | |
tree | 905b70ad82e0608458cd0be85c2d2a0c9a62ac90 /ui | |
parent | 445f43743b73fbd63cccba7fa7ae890c907fe6dd (diff) | |
download | petitboot-702f9c313dea66817cf05196d84cd07889e80c51.zip petitboot-702f9c313dea66817cf05196d84cd07889e80c51.tar.gz |
ui/ncurses: Add text_screen_set_text()
When we have a large chunk of text, we'll want to add it all in one go.
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Diffstat (limited to 'ui')
-rw-r--r-- | ui/ncurses/nc-textscreen.c | 44 | ||||
-rw-r--r-- | ui/ncurses/nc-textscreen.h | 3 |
2 files changed, 38 insertions, 9 deletions
diff --git a/ui/ncurses/nc-textscreen.c b/ui/ncurses/nc-textscreen.c index 3b0d01d..891c8a1 100644 --- a/ui/ncurses/nc-textscreen.c +++ b/ui/ncurses/nc-textscreen.c @@ -24,6 +24,7 @@ #include <talloc/talloc.h> #include <types/types.h> #include <log/log.h> +#include <fold/fold.h> #include <util/util.h> #include "nc-cui.h" @@ -87,7 +88,22 @@ void text_screen_clear(struct text_screen *screen) talloc_free(screen->lines); screen->n_lines = 0; screen->n_alloc_lines = 16; - screen->lines = talloc_array(screen, char *, screen->n_alloc_lines); + screen->lines = talloc_array(screen, const char *, + screen->n_alloc_lines); +} + +static void __text_screen_append_line(struct text_screen *screen, + const char *line) +{ + if (screen->n_lines == screen->n_alloc_lines) { + screen->n_alloc_lines *= 2; + screen->lines = talloc_realloc(screen, screen->lines, + const char *, + screen->n_alloc_lines); + } + + screen->lines[screen->n_lines] = line; + screen->n_lines++; } void text_screen_append_line(struct text_screen *screen, const char *fmt, ...) @@ -103,16 +119,24 @@ void text_screen_append_line(struct text_screen *screen, const char *fmt, ...) line = ""; } - if (screen->n_lines == screen->n_alloc_lines) { - screen->n_alloc_lines *= 2; - screen->lines = talloc_realloc(screen, screen->lines, - char *, screen->n_alloc_lines); - } + __text_screen_append_line(screen, line); +} - screen->lines[screen->n_lines] = line; - screen->n_lines++; +static int text_screen_fold_cb(void *arg, const char *buf, int len) +{ + struct text_screen *screen = arg; + + buf = len ? talloc_strndup(screen->lines, buf, len) : ""; + __text_screen_append_line(screen, buf); + + return 0; } +void text_screen_set_text(struct text_screen *screen, const char *text) +{ + fold_text(text, getmaxx(screen->scr.sub_ncw), text_screen_fold_cb, + screen); +} void text_screen_process_key(struct nc_scr *scr, int key) { @@ -157,6 +181,10 @@ void text_screen_init(struct text_screen *screen, struct cui *cui, cui, text_screen_process_key, text_screen_post, NULL, text_screen_resize); + /* this will establish our array of lines */ + screen->lines = NULL; + text_screen_clear(screen); + screen->cui = cui; screen->on_exit = on_exit; diff --git a/ui/ncurses/nc-textscreen.h b/ui/ncurses/nc-textscreen.h index 92c6bfe..8afcf49 100644 --- a/ui/ncurses/nc-textscreen.h +++ b/ui/ncurses/nc-textscreen.h @@ -24,7 +24,7 @@ struct text_screen { struct nc_scr scr; struct cui *cui; - char **lines; + const char **lines; int n_lines; int n_alloc_lines; int scroll_y; @@ -41,6 +41,7 @@ struct nc_scr *text_screen_scr(struct text_screen *screen); void text_screen_clear(struct text_screen *screen); void text_screen_append_line(struct text_screen *screen, const char *fmt, ...) __attribute__((format(printf, 2, 3))); +void text_screen_set_text(struct text_screen *screen, const char *text); /* interaction */ void text_screen_process_key(struct nc_scr *scr, int key); |