ui/ncurses: Add text_screen_set_text()
authorJeremy Kerr <jk@ozlabs.org>
Mon, 9 Dec 2013 03:52:57 +0000 (11:52 +0800)
committerJeremy Kerr <jk@ozlabs.org>
Fri, 31 Jan 2014 00:46:34 +0000 (08:46 +0800)
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>
ui/ncurses/nc-textscreen.c
ui/ncurses/nc-textscreen.h

index 3b0d01d9910d1a60d809d6a77607112dee251b78..891c8a1c91939512ea5e47ffd50946d6d669de7e 100644 (file)
@@ -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;
 
index 92c6bfe619da5b1cdf0a804ccfcc57342bc0e1f7..8afcf495a126e2a3e57be193d0ffa20bffb1f153 100644 (file)
@@ -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);