]> git.ozlabs.org Git - petitboot/blobdiff - ui/ncurses/nc-textscreen.c
discover: Maintain a backlog of status updates
[petitboot] / ui / ncurses / nc-textscreen.c
index ad91f61e4c14b83cb499c8235cdd737d04232490..a460188180ab10621d2dca5176ee6f6b139cecce 100644 (file)
@@ -26,6 +26,7 @@
 #include <log/log.h>
 #include <fold/fold.h>
 #include <util/util.h>
+#include <i18n/i18n.h>
 
 #include "nc-cui.h"
 #include "nc-textscreen.h"
@@ -40,14 +41,15 @@ struct text_screen *text_screen_from_scr(struct nc_scr *scr)
 
 void text_screen_draw(struct text_screen *screen)
 {
-       int max_y, i;
+       int max_y, max_x, i;
 
        max_y = getmaxy(screen->scr.sub_ncw);
+       max_x = getmaxx(screen->scr.sub_ncw) - 1;
 
        max_y = min(max_y, screen->scroll_y + screen->n_lines);
 
        for (i = screen->scroll_y; i < max_y; i++)
-               mvwaddstr(screen->scr.sub_ncw, i, 1, screen->lines[i]);
+               mvwaddnstr(screen->scr.sub_ncw, i, 1, screen->lines[i], max_x);
 
        wrefresh(screen->scr.sub_ncw);
 }
@@ -55,6 +57,7 @@ void text_screen_draw(struct text_screen *screen)
 static void text_screen_scroll(struct text_screen *screen, int key)
 {
        int win_lines = getmaxy(screen->scr.sub_ncw);
+       int win_cols = getmaxx(screen->scr.sub_ncw) - 1;
        int delta;
 
        if (key == KEY_UP)
@@ -73,11 +76,12 @@ static void text_screen_scroll(struct text_screen *screen, int key)
        wscrl(screen->scr.sub_ncw, delta);
 
        if (delta > 0) {
-               mvwaddstr(screen->scr.sub_ncw, win_lines - 1, 1,
-                               screen->lines[screen->scroll_y+win_lines-1]);
+               mvwaddnstr(screen->scr.sub_ncw, win_lines - 1, 1,
+                               screen->lines[screen->scroll_y+win_lines-1],
+                               win_cols);
        } else if (delta < 0) {
-               mvwaddstr(screen->scr.sub_ncw, 0, 1,
-                               screen->lines[screen->scroll_y]);
+               mvwaddnstr(screen->scr.sub_ncw, 0, 1,
+                               screen->lines[screen->scroll_y], win_cols);
        }
 
        wrefresh(screen->scr.sub_ncw);
@@ -134,7 +138,7 @@ static int text_screen_fold_cb(void *arg, const char *buf, int len)
 
 void text_screen_set_text(struct text_screen *screen, const char *text)
 {
-       fold_text(text, getmaxx(screen->scr.sub_ncw), text_screen_fold_cb,
+       fold_text(text, getmaxx(screen->scr.sub_ncw) - 1, text_screen_fold_cb,
                        screen);
 }
 
@@ -173,15 +177,22 @@ struct nc_scr *text_screen_scr(struct text_screen *screen)
 }
 
 void text_screen_set_help(struct text_screen *screen, const char *title,
-               const char *text)
+               const struct help_text *text)
 {
        screen->help_title = title;
        screen->help_text = text;
-       screen->scr.frame.help = "x=exit, h=help";
+       screen->scr.frame.help = _("x=exit, h=help");
 }
 
 static int text_screen_post(struct nc_scr *scr)
 {
+       struct text_screen *screen = text_screen_from_scr(scr);
+
+       if (screen->need_update) {
+               text_screen_draw(screen);
+               screen->need_update = false;
+       }
+
        nc_scr_frame_draw(scr);
        redrawwin(scr->main_ncw);
        wrefresh(scr->main_ncw);
@@ -201,9 +212,10 @@ void text_screen_init(struct text_screen *screen, struct cui *cui,
 
        screen->cui = cui;
        screen->on_exit = on_exit;
+       screen->need_update = false;
 
        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);
 }