summaryrefslogtreecommitdiffstats
path: root/ui/ncurses
diff options
context:
space:
mode:
authorSamuel Mendoza-Jonas <sam@mendozajonas.com>2017-10-10 15:36:27 +1100
committerSamuel Mendoza-Jonas <sam@mendozajonas.com>2017-10-11 11:53:26 +1100
commiteac7fc04e7ce07f6b1a6a0d19af86ae7f74ebc5e (patch)
tree60a5614cf374584bbe7106d186ae662ab5fc5934 /ui/ncurses
parente1e2ca689661791ba38bf2572df8a65e36258ac2 (diff)
downloadtalos-petitboot-eac7fc04e7ce07f6b1a6a0d19af86ae7f74ebc5e.tar.gz
talos-petitboot-eac7fc04e7ce07f6b1a6a0d19af86ae7f74ebc5e.zip
ui/ncurses: Display multibyte strings correctly in textscreens
In nc-textscreen each line of text is capped at a certain length to avoid running off the side of the viewable screen. However it appears the ncurses function mvwaddnstr() counts by byte instead of actual character, causing strings which contain multibyte characters to be cut short. To avoid this check the displayed length of each string against the screen width, and if under instruct mvwaddnstr() to print the whole string. Signed-off-by: Samuel Mendoza-Jonas <sam@mendozajonas.com>
Diffstat (limited to 'ui/ncurses')
-rw-r--r--ui/ncurses/nc-textscreen.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/ui/ncurses/nc-textscreen.c b/ui/ncurses/nc-textscreen.c
index a460188..0be2016 100644
--- a/ui/ncurses/nc-textscreen.c
+++ b/ui/ncurses/nc-textscreen.c
@@ -41,15 +41,17 @@ struct text_screen *text_screen_from_scr(struct nc_scr *scr)
void text_screen_draw(struct text_screen *screen)
{
- int max_y, max_x, i;
+ int max_y, max_x, i, len;
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++)
- mvwaddnstr(screen->scr.sub_ncw, i, 1, screen->lines[i], max_x);
+ for (i = screen->scroll_y; i < max_y; i++) {
+ len = strncols(screen->lines[i]) > max_x ? max_x : -1;
+ mvwaddnstr(screen->scr.sub_ncw, i, 1, screen->lines[i], len);
+ }
wrefresh(screen->scr.sub_ncw);
}
@@ -58,7 +60,7 @@ 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;
+ int delta, len, i;
if (key == KEY_UP)
delta = -1;
@@ -75,13 +77,16 @@ static void text_screen_scroll(struct text_screen *screen, int key)
screen->scroll_y += delta;
wscrl(screen->scr.sub_ncw, delta);
+
if (delta > 0) {
+ i = screen->scroll_y + win_lines - 1;
+ len = strncols(screen->lines[i]) > win_cols ? win_cols : -1;
mvwaddnstr(screen->scr.sub_ncw, win_lines - 1, 1,
- screen->lines[screen->scroll_y+win_lines-1],
- win_cols);
+ screen->lines[i], len);
} else if (delta < 0) {
- mvwaddnstr(screen->scr.sub_ncw, 0, 1,
- screen->lines[screen->scroll_y], win_cols);
+ i = screen->scroll_y;
+ len = strncols(screen->lines[i]) > win_cols ? win_cols : -1;
+ mvwaddnstr(screen->scr.sub_ncw, 0, 1, screen->lines[i], len);
}
wrefresh(screen->scr.sub_ncw);
OpenPOWER on IntegriCloud