47f #include #include #include static ITEM *items[30]; static int menu_virtualize(int c) { if (c == '\n' || c == KEY_EXIT) return(MAX_COMMAND + 1); else if (c == 'n' || c == KEY_DOWN) return(REQ_NEXT_ITEM); else if (c == 'p' || c == KEY_UP) return(REQ_PREV_ITEM); else return(c); } int popup_menu(char *names[], int menu_y, int menu_x) { MENU *m; ITEM **ip = items; char **ap; int mrows, mcols, n; WINDOW *menuwin, *subwin; int i; for (ap = names; *ap; ap++) *ip++ = new_item(*ap, ""); *ip = (ITEM *)NULL; m = new_menu(items); scale_menu(m, &mrows, &mcols); menuwin = newwin(mrows + 2, mcols + 2, menu_y, menu_x); set_menu_win(m, menuwin); keypad(menuwin, TRUE); box(menuwin, 0, 0); subwin = derwin(menuwin, mrows, mcols, 1, 1); set_menu_sub(m, subwin); post_menu(m); while (menu_driver(m, menu_virtualize(wgetch(menuwin))) != E_UNKNOWN_COMMAND); n = item_index(current_item(m)); unpost_menu(m); delwin(subwin); delwin(menuwin); for (ip = items; *ip; ip++) free_item(*ip); free_menu(m); return(n); } . 0