NCurses Refresh

2020-02-05 13:53发布

问题:

I have a small ncurse program I'm running, but the output doesn't seem to show up unless I stick the wrefresh() in a while loop.

Is there some buffering going on or something? I tried other refresh functions in the library and fflush with stddout (which I don't think makes sense, but worth a try), but nothing seems to work.

A second small question: to make getch() non-blocking we need to call nodelay(win,TRUE), right?


void main()
{
        initscr();
        start_color();
        init_pair(1,COLOR_YELLOW,COLOR_CYAN);
        WINDOW *win = newwin(10,10,1,1);
        wbkgd(win,COLOR_PAIR(1));
        wprintw(win,"Hello, World.");
        wrefresh(win);
        getch();
        delwin(win);
        endwin();
}

回答1:

You are not supposed to mix operations on stdscr and windows created with newwin(). getch() operates on stdscr, so that is your problem. Replace that call with

wgetch(win);

(getch() is causing stdscr to be dumped over the top of your other window, and because that happens so quickly it looks like the other window never got displayed at all).



回答2:

That's working as designed. That allows you to completely redraw your next screen but only the parts that actually changed get sent to the terminal at refresh time. This isn't such a big deal these days but made a big difference when terminal connections were relatively slow.



标签: c ncurses