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>
#include <talloc/talloc.h>
#include <types/types.h>
#include <log/log.h>
#include <talloc/talloc.h>
#include <types/types.h>
#include <log/log.h>
#include <util/util.h>
#include "nc-cui.h"
#include <util/util.h>
#include "nc-cui.h"
talloc_free(screen->lines);
screen->n_lines = 0;
screen->n_alloc_lines = 16;
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, ...)
}
void text_screen_append_line(struct text_screen *screen, const char *fmt, ...)
- 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)
{
void text_screen_process_key(struct nc_scr *scr, int key)
{
cui, text_screen_process_key,
text_screen_post, NULL, text_screen_resize);
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;
screen->cui = cui;
screen->on_exit = on_exit;
struct text_screen {
struct nc_scr scr;
struct cui *cui;
struct text_screen {
struct nc_scr scr;
struct cui *cui;
int n_lines;
int n_alloc_lines;
int scroll_y;
int n_lines;
int n_alloc_lines;
int scroll_y;
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_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);
/* interaction */
void text_screen_process_key(struct nc_scr *scr, int key);