summaryrefslogtreecommitdiffstats
path: root/ui
diff options
context:
space:
mode:
authorJeremy Kerr <jk@ozlabs.org>2013-12-09 11:52:57 +0800
committerJeremy Kerr <jk@ozlabs.org>2014-01-31 08:46:34 +0800
commit702f9c313dea66817cf05196d84cd07889e80c51 (patch)
tree905b70ad82e0608458cd0be85c2d2a0c9a62ac90 /ui
parent445f43743b73fbd63cccba7fa7ae890c907fe6dd (diff)
downloadpetitboot-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.c44
-rw-r--r--ui/ncurses/nc-textscreen.h3
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);
OpenPOWER on IntegriCloud