X-Git-Url: http://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=ui%2Fncurses%2Fnc-menu.c;h=ef00ff2cc464e920ac8a98e595cdb14e821adadf;hp=87b58e2d28f3ccaefa7a62755ae96991f9fb1768;hb=e07bd59ad5f4ba9cd113f8dfdcc72e6ca2e69819;hpb=567e6be38a53cd6c832c4425645e1116fc9e5216 diff --git a/ui/ncurses/nc-menu.c b/ui/ncurses/nc-menu.c index 87b58e2..ef00ff2 100644 --- a/ui/ncurses/nc-menu.c +++ b/ui/ncurses/nc-menu.c @@ -16,7 +16,9 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#define _GNU_SOURCE +#if defined(HAVE_CONFIG_H) +#include "config.h" +#endif #include #include @@ -25,6 +27,7 @@ #include "log/log.h" #include "talloc/talloc.h" #include "ui/common/ui-system.h" +#include "nc-cui.h" #include "nc-menu.h" /** @@ -103,10 +106,8 @@ struct pmenu_item *pmenu_item_setup(struct pmenu *menu, struct pmenu_item *i, i->pmenu = menu; i->nci = new_item(name, NULL); - if (!i->nci) { - talloc_free(i); + if (!i->nci) return NULL; - } set_item_userptr(i->nci, i); @@ -128,54 +129,6 @@ static int pmenu_item_get_index(const struct pmenu_item *item) return -1; } -/** - * pmenu_item_replace - Replace the menu item with a new one. - * - * Use this routine to change a menu item's text. - */ - -int pmenu_item_replace(struct pmenu_item *i, const char *name) -{ - struct pmenu *menu; - ITEM *nci; - int index; - - assert(name); - assert(i->nci); - - menu = i->pmenu; - index = pmenu_item_get_index(i); - - if (index < 0) { - assert(0 && "get_index failed"); - return -1; - } - - nci = new_item(name, NULL); - - if (!nci) { - assert(0 && "new_item failed"); - return -1; - } - - set_item_userptr(nci, i); - - menu->scr.unpost(&menu->scr); - set_menu_items(menu->ncm, NULL); - - // FIXME: need to assure item name is a talloc string. - /* talloc_free((char *)item_name(i->nci)); */ - - free_item(i->nci); - menu->items[index] = nci; - i->nci = nci; - - set_menu_items(menu->ncm, menu->items); - menu->scr.post(&menu->scr); - - return 0; -} - /** * pmenu_move_cursor - Move the cursor. * @req: An ncurses request or char to send to menu_driver(). @@ -191,67 +144,77 @@ static void pmenu_move_cursor(struct pmenu *menu, int req) * pmenu_process_key - Process a user keystroke. */ -static void pmenu_process_key(struct nc_scr *scr) +static void pmenu_process_key(struct nc_scr *scr, int key) { struct pmenu *menu = pmenu_from_scr(scr); struct pmenu_item *item = pmenu_find_selected(menu); nc_scr_status_free(&menu->scr); - while (1) { - int c = getch(); - - if (c == ERR) - return; - - DBGS("%d (%o)\n", c, c); - - if (menu->hot_key) - c = menu->hot_key(menu, item, c); - - switch (c) { - case 27: /* ESC */ - if (menu->on_exit) - menu->on_exit(menu); - nc_flush_keys(); - return; - - case KEY_PPAGE: - pmenu_move_cursor(menu, REQ_SCR_UPAGE); - break; - case KEY_NPAGE: - pmenu_move_cursor(menu, REQ_SCR_DPAGE); - break; - case KEY_HOME: - pmenu_move_cursor(menu, REQ_FIRST_ITEM); - break; - case KEY_END: - pmenu_move_cursor(menu, REQ_LAST_ITEM); - break; - case KEY_UP: - pmenu_move_cursor(menu, REQ_UP_ITEM); - break; - case KEY_DOWN: - pmenu_move_cursor(menu, REQ_DOWN_ITEM); - break; - case 'e': - if (item->on_edit) - item->on_edit(item); - break; - case 'o': - DBGS("on_open: %p\n", menu->on_open); - if (menu->on_open) - menu->on_open(menu); - break; - case '\n': - case '\r': - if (item->on_execute) - item->on_execute(item); - break; - default: - menu_driver(menu->ncm, c); - break; - } + if (menu->hot_key) + key = menu->hot_key(menu, item, key); + + switch (key) { + case 27: /* ESC */ + case 'x': + if (menu->on_exit) + menu->on_exit(menu); + nc_flush_keys(); + return; + + case KEY_PPAGE: + pmenu_move_cursor(menu, REQ_SCR_UPAGE); + break; + case KEY_NPAGE: + pmenu_move_cursor(menu, REQ_SCR_DPAGE); + break; + case KEY_HOME: + pmenu_move_cursor(menu, REQ_FIRST_ITEM); + break; + case KEY_END: + pmenu_move_cursor(menu, REQ_LAST_ITEM); + break; + case KEY_UP: + pmenu_move_cursor(menu, REQ_UP_ITEM); + break; + case KEY_BTAB: + pmenu_move_cursor(menu, REQ_PREV_ITEM); + break; + case KEY_DOWN: + pmenu_move_cursor(menu, REQ_DOWN_ITEM); + break; + case '\t': + pmenu_move_cursor(menu, REQ_NEXT_ITEM); + break; + case 'e': + if (item->on_edit) + item->on_edit(item); + break; + case 'n': + if (menu->on_new) + menu->on_new(menu); + break; + case ' ': + case '\n': + case '\r': + if (item->on_execute) + item->on_execute(item); + break; + case 'i': + cui_show_sysinfo(cui_from_arg(scr->ui_ctx)); + break; + case 'c': + cui_show_config(cui_from_arg(scr->ui_ctx)); + break; + case KEY_F(1): + case 'h': + if (menu->help_text) + cui_show_help(cui_from_arg(scr->ui_ctx), + menu->help_title, menu->help_text); + break; + default: + menu_driver(menu->ncm, key); + break; } } @@ -385,6 +348,8 @@ int pmenu_setup(struct pmenu *menu) /* Makes menu scrollable. */ set_menu_format(menu->ncm, LINES - nc_scr_frame_lines, 1); + set_menu_grey(menu->ncm, A_NORMAL); + return 0; }