X-Git-Url: https://git.ozlabs.org/?p=petitboot;a=blobdiff_plain;f=ui%2Fncurses%2Fnc-menu.c;h=745c1ff15f2a6cba0d7f71caac91b902e2795893;hp=073860bbfc772f0a9b59730111ddd1e382870d0b;hb=37bff93c8b0a71432613f41f2319dc073ca64619;hpb=97c5d1f5d56d9ce890b4896ad7a9dc7ece7d4347 diff --git a/ui/ncurses/nc-menu.c b/ui/ncurses/nc-menu.c index 073860b..745c1ff 100644 --- a/ui/ncurses/nc-menu.c +++ b/ui/ncurses/nc-menu.c @@ -16,9 +16,9 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#if defined(HAVE_CONFIG_H) #include "config.h" - -#define _GNU_SOURCE +#endif #include #include @@ -27,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" /** @@ -75,46 +76,49 @@ static void pmenu_resize(struct nc_scr *scr) pmenu_post(scr); } +static int pmenu_item_destructor(void *arg) +{ + struct pmenu_item *item = arg; + free_item(item->nci); + return 0; +} + /** - * pmenu_item_init - Allocate and initialize a new pmenu_item instance. + * pmenu_item_create - Allocate and initialize a new pmenu_item instance. * * Returns a pointer the the initialized struct pmenu_item instance or NULL * on error. The caller is responsible for calling talloc_free() for the * returned instance. */ - -struct pmenu_item *pmenu_item_alloc(struct pmenu *menu) +struct pmenu_item *pmenu_item_create(struct pmenu *menu, const char *name) { - /* Items go with the menu, not the pointer array. */ + struct pmenu_item *item = talloc_zero(menu, struct pmenu_item); - struct pmenu_item *i = talloc_zero(menu, struct pmenu_item); + item->i_sig = pb_item_sig; + item->pmenu = menu; + item->nci = new_item(name, NULL); - return i; -} - -struct pmenu_item *pmenu_item_setup(struct pmenu *menu, struct pmenu_item *i, - unsigned int index, const char *name) -{ - assert(i); - assert(name); - - if (!i) + if (!item->nci) { + talloc_free(item); return NULL; + } - i->i_sig = pb_item_sig; - i->pmenu = menu; - i->nci = new_item(name, NULL); + talloc_set_destructor(item, pmenu_item_destructor); - if (!i->nci) { - talloc_free(i); - return NULL; - } + set_item_userptr(item->nci, item); - set_item_userptr(i->nci, i); + return item; +} - menu->items[index] = i->nci; +void pmenu_item_insert(struct pmenu *menu, struct pmenu_item *item, + unsigned int index) +{ + assert(item); + assert(index < menu->item_count); + assert(menu->items[index] == NULL); + assert(menu_items(menu->ncm) == NULL); - return i; + menu->items[index] = item->nci; } static int pmenu_item_get_index(const struct pmenu_item *item) @@ -130,54 +134,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(). @@ -205,6 +161,7 @@ static void pmenu_process_key(struct nc_scr *scr, int key) switch (key) { case 27: /* ESC */ + case 'x': if (menu->on_exit) menu->on_exit(menu); nc_flush_keys(); @@ -225,22 +182,41 @@ static void pmenu_process_key(struct nc_scr *scr, int key) 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_open) - menu->on_open(menu); + 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; @@ -303,7 +279,6 @@ int pmenu_remove(struct pmenu *menu, struct pmenu_item *item) if (index < 0) return -1; - free_item(item->nci); talloc_free(item); /* Note that items array has a null terminator. */ @@ -377,6 +352,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; } @@ -387,14 +364,9 @@ int pmenu_setup(struct pmenu *menu) void pmenu_delete(struct pmenu *menu) { - unsigned int i; - assert(menu->scr.sig == pb_pmenu_sig); menu->scr.sig = pb_removed_sig; - for (i = item_count(menu->ncm); i; i--) - free_item(menu->items[i - 1]); - free_menu(menu->ncm); delwin(menu->scr.sub_ncw); delwin(menu->scr.main_ncw);