X-Git-Url: http://git.ozlabs.org/?a=blobdiff_plain;f=ui%2Fncurses%2Fnc-scr.c;h=e8c5fcabc1b783b46ba051c1db45ec415a50b329;hb=d57d1c9c4cd7365063da7aa1f018736166bb3a50;hp=ff20d637781289572d962430b0a094e7195447ce;hpb=d28b706489cfd2c11e281ff3eaeb136ca154a1ee;p=petitboot diff --git a/ui/ncurses/nc-scr.c b/ui/ncurses/nc-scr.c index ff20d63..e8c5fca 100644 --- a/ui/ncurses/nc-scr.c +++ b/ui/ncurses/nc-scr.c @@ -22,59 +22,57 @@ #include #include +#include #include "log/log.h" #include "talloc/talloc.h" #include "nc-scr.h" -void nc_start(void) +static void nc_scr_status_clear(struct nc_scr *scr) { - initscr(); /* Initialize ncurses. */ - cbreak(); /* Disable line buffering. */ - noecho(); /* Disable getch() echo. */ - keypad(stdscr, TRUE); /* Enable num keypad keys. */ - nonl(); /* Disable new-line translation. */ - intrflush(stdscr, FALSE); /* Disable interrupt flush. */ - curs_set(0); /* Make cursor invisible */ - nodelay(stdscr, TRUE); /* Enable non-blocking getch() */ - - /* We may be operating with an incorrect $TERM type; in this case - * the keymappings will be slightly broken. We want at least - * backspace to work though, so we'll define both DEL and ^H to - * map to backspace */ - define_key("\x7f", KEY_BACKSPACE); - define_key("\x08", KEY_BACKSPACE); - - while (getch() != ERR) /* flush stdin */ - (void)0; + mvwhline(scr->main_ncw, LINES - nc_scr_pos_status, 0, ' ', COLS); } -void nc_atexit(void) +static void nc_scr_status_draw(struct nc_scr *scr) { - clear(); - refresh(); - endwin(); + mvwaddstr(scr->main_ncw, LINES - nc_scr_pos_status, 1, + scr->frame.status); } -static void nc_scr_status_clear(struct nc_scr *scr) +int nc_scr_post(struct nc_scr *scr) { - mvwhline(scr->main_ncw, LINES - nc_scr_pos_status, 0, ' ', COLS); + if (scr->post) + return scr->post(scr); + return 0; } -static void nc_scr_status_draw(struct nc_scr *scr) +int nc_scr_unpost(struct nc_scr *scr) { - mvwaddstr(scr->main_ncw, LINES - nc_scr_pos_status, 1, - scr->frame.status); + if (scr->unpost) + return scr->unpost(scr); + return 0; } void nc_scr_frame_draw(struct nc_scr *scr) { - DBGS("title '%s'\n", scr->frame.title); + int ltitle_len, rtitle_len; + + DBGS("ltitle '%s'\n", scr->frame.ltitle); + DBGS("rtitle '%s'\n", scr->frame.rtitle); DBGS("help '%s'\n", scr->frame.help); DBGS("status '%s'\n", scr->frame.status); - mvwaddstr(scr->main_ncw, nc_scr_pos_title, 1, scr->frame.title); + ltitle_len = strlen(scr->frame.ltitle); + rtitle_len = scr->frame.rtitle ? strlen(scr->frame.rtitle) : 0; + + /* if both ltitle and rtitle don't fit, trim rtitle */ + if (ltitle_len + rtitle_len + nc_scr_pos_lrtitle_space > COLS - 2) + rtitle_len = COLS - 2 - ltitle_len - nc_scr_pos_lrtitle_space; + + mvwaddstr(scr->main_ncw, nc_scr_pos_title, 1, scr->frame.ltitle); + mvwaddnstr(scr->main_ncw, nc_scr_pos_title, COLS - rtitle_len - 1, + scr->frame.rtitle, rtitle_len); mvwhline(scr->main_ncw, nc_scr_pos_title_sep, 1, ACS_HLINE, COLS - 2); mvwhline(scr->main_ncw, LINES - nc_scr_pos_help_sep, 1, ACS_HLINE,