#include <talloc/talloc.h>
#include <types/types.h>
#include <log/log.h>
+#include <fold/fold.h>
#include <util/util.h>
+#include <i18n/i18n.h>
#include "nc-cui.h"
#include "nc-textscreen.h"
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, ...)
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)
{
switch (key) {
case 'x':
+ case 27: /* esc */
screen->on_exit(screen->cui);
break;
case KEY_DOWN:
case KEY_UP:
text_screen_scroll(screen, key);
break;
+ case 'h':
+ if (screen->help_text)
+ cui_show_help(screen->cui, screen->help_title,
+ screen->help_text);
+ break;
default:
break;
}
return &screen->scr;
}
+void text_screen_set_help(struct text_screen *screen, const char *title,
+ const struct help_text *text)
+{
+ screen->help_title = title;
+ screen->help_text = text;
+ screen->scr.frame.help = _("x=exit, h=help");
+}
+
static int text_screen_post(struct nc_scr *scr)
{
nc_scr_frame_draw(scr);
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->scr.frame.ltitle = talloc_strdup(screen, title);
screen->scr.frame.rtitle = NULL;
- screen->scr.frame.help = "x=exit";
+ screen->scr.frame.help = _("x=exit");
scrollok(screen->scr.sub_ncw, true);
}