X-Git-Url: https://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=ui%2Fncurses%2Fnc-menu.c;h=073860bbfc772f0a9b59730111ddd1e382870d0b;hp=87b58e2d28f3ccaefa7a62755ae96991f9fb1768;hb=97c5d1f5d56d9ce890b4896ad7a9dc7ece7d4347;hpb=567e6be38a53cd6c832c4425645e1116fc9e5216 diff --git a/ui/ncurses/nc-menu.c b/ui/ncurses/nc-menu.c index 87b58e2..073860b 100644 --- a/ui/ncurses/nc-menu.c +++ b/ui/ncurses/nc-menu.c @@ -16,6 +16,8 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include "config.h" + #define _GNU_SOURCE #include @@ -191,67 +193,57 @@ 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 */ + 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 'n': + 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, key); + break; } }