Listing 1: A Program skeleton Illustrating How to Use Some New ncurses Features

#include <curses.h>
#include <signal.h>

static void finish(int sig);

main(int argc, char *argv[])
{
    /* initialize your non-curses data structures here */

    /* arrange interrupts to terminate */
    (void) signal(SIGINT, finish);

    /* initialize the curses library */
    (void) initscr();
    /* enable keyboard mapping (non-BSD feature) */
    keypad(stdscr, TRUE);
    /* tell curses not to do NL->CR/NL on output */
    (void) nonl();
    /* take input chars one at a time, don't wait for <\\>n */
    (void) cbreak();
    /* don't echo input */
    (void) noecho();

    if (has_colors())
    {
        start_color();

        /*
         * Simple color assignment, often all we need.
         * Enables basic 8 colors on black background.
         * BSD curses can't do this!
         */
        init_pair(COLOR_BLACK, COLOR_BLACK, COLOR_BLACK);
        init_pair(COLOR_GREEN, COLOR_GREEN, COLOR_BLACK);
        init_pair(COLOR_RED, COLOR_RED, COLOR_BLACK);
        init_pair(COLOR_CYAN, COLOR_CYAN, COLOR_BLACK);
        init_pair(COLOR_WHITE, COLOR_WHITE, COLOR_BLACK);
        init_pair(COLOR_MAGENTA, COLOR_MAGENTA, COLOR_BLACK);
        init_pair(COLOR_BLUE, COLOR_BLUE, COLOR_BLACK);
        init_pair(COLOR_YELLOW, COLOR_YELLOW, COLOR_BLACK);
    }

    for (;;)
    {
        /* refresh, accept single keystroke of input */
        int c = getch();

        /* process the command keystroke (see Listing 2) */
    }

    finish(0);               /* we're done */
}

static void finish(int sig)
{
    endwin();

    /* do your non-curses wrapup here; see Listing 2 */

    exit(0);
}