#include #include #include static char const * item_text[] = { "One", "Two", "Three", "Four", }; int main() { const int n = sizeof(item_text) / sizeof(item_text[0]); ITEM * items[n + 1]; int maxlen = 0; MENU * menu; WINDOW * menuwin; int done; int i; initscr(); keypad(stdscr, TRUE); nonl(); cbreak(); noecho(); for (i = 0; i < n; ++i) { int len; items[i] = new_item(item_text[i], item_text[i]); set_item_value(items[i], TRUE); /* This doesn't do anything */ if ((len = strlen(item_text[i])) > maxlen) { maxlen = len; } } items[n] = NULL; menu = new_menu(items); menu_opts_off(menu, O_ONEVALUE); menuwin = newwin(n + 2, maxlen + 3, (LINES - (n + 2)) / 2, (COLS - (maxlen + 3)) / 2); keypad(menuwin, TRUE); set_menu_win(menu, menuwin); set_menu_sub(menu, derwin(menuwin, n, maxlen + 1, 1, 1)); box(menuwin, 0, 0); refresh(); post_menu(menu); for (i = 0; i < n; ++i) { set_item_value(items[i], TRUE); /* Only this one works */ } wrefresh(menuwin); done = 0; while (done == 0) { i = getch(); switch (i) { case KEY_ENTER: case '\r': case '\n': done = 1; break; case KEY_BREAK: case KEY_EXIT: case 'q': case '\x03': /* Ctrl + C */ case '\x1b': /* Esc */ done = 2; break; case KEY_DOWN: menu_driver(menu, REQ_DOWN_ITEM); break; case KEY_UP: menu_driver(menu, REQ_UP_ITEM); break; case ' ': menu_driver(menu, REQ_TOGGLE_ITEM); break; } wrefresh(menuwin); } /* Tidy */ delwin(menuwin); free_menu(menu); for (i = 0; i < n; ++i) { free_item(items[i]); } endwin(); return 0; }