Commit fc9d64ff authored by Pali Rohár's avatar Pali Rohár Committed by Anatolij Gustschin

menu: Add support for user defined item choice function

Selecting menu items is currently done in menu_interactive_choice()
by reading the user input strings from standard input.

Extend menu_interactive_choice() to support user defined function
for selecting menu items. This function and its argument can be
specified when creating the menu.
Signed-off-by: default avatarPali Rohár <pali.rohar@gmail.com>
Signed-off-by: default avatarAnatolij Gustschin <agust@denx.de>
parent 009d75cc
......@@ -561,7 +561,8 @@ static char *menu_handle(struct menu_display *display)
char *s;
char temp[6][200];
m = menu_create(display->title, display->timeout, 1, ait_menu_print);
m = menu_create(display->title, display->timeout, 1, ait_menu_print,
NULL, NULL);
for (i = 0; display->menulist[i]; i++) {
sprintf(key, "%d", i + 1);
......
......@@ -1280,7 +1280,8 @@ static struct menu *pxe_menu_to_menu(struct pxe_menu *cfg)
/*
* Create a menu and add items for all the labels.
*/
m = menu_create(cfg->title, cfg->timeout, cfg->prompt, label_print);
m = menu_create(cfg->title, cfg->timeout, cfg->prompt, label_print,
NULL, NULL);
if (!m)
return NULL;
......
......@@ -47,6 +47,8 @@ struct menu {
char *title;
int prompt;
void (*item_data_print)(void *);
char *(*item_choice)(void *);
void *item_choice_data;
struct list_head items;
};
......@@ -204,18 +206,26 @@ static inline int menu_interactive_choice(struct menu *m, void **choice)
menu_display(m);
readret = readline_into_buffer("Enter choice: ", cbuf,
m->timeout / 10);
if (!m->item_choice) {
readret = readline_into_buffer("Enter choice: ", cbuf,
m->timeout / 10);
if (readret >= 0) {
choice_item = menu_item_by_key(m, cbuf);
if (!choice_item) {
printf("%s not found\n", cbuf);
m->timeout = 0;
if (readret >= 0) {
choice_item = menu_item_by_key(m, cbuf);
if (!choice_item)
printf("%s not found\n", cbuf);
} else {
return menu_default_choice(m, choice);
}
} else
return menu_default_choice(m, choice);
} else {
char *key = m->item_choice(m->item_choice_data);
if (key)
choice_item = menu_item_by_key(m, key);
}
if (!choice_item)
m->timeout = 0;
}
*choice = choice_item->data;
......@@ -348,11 +358,19 @@ int menu_item_add(struct menu *m, char *item_key, void *item_data)
* what must be entered to select an item, the item_data_print function should
* make it obvious what the key for each entry is.
*
* item_choice - If not NULL, will be called when asking the user to choose an
* item. Returns a key string corresponding to the choosen item or NULL if
* no item has been selected.
*
* item_choice_data - Will be passed as the argument to the item_choice function
*
* Returns a pointer to the menu if successful, or NULL if there is
* insufficient memory available to create the menu.
*/
struct menu *menu_create(char *title, int timeout, int prompt,
void (*item_data_print)(void *))
void (*item_data_print)(void *),
char *(*item_choice)(void *),
void *item_choice_data)
{
struct menu *m;
......@@ -365,6 +383,8 @@ struct menu *menu_create(char *title, int timeout, int prompt,
m->prompt = prompt;
m->timeout = timeout;
m->item_data_print = item_data_print;
m->item_choice = item_choice;
m->item_choice_data = item_choice_data;
if (title) {
m->title = strdup(title);
......
......@@ -51,7 +51,9 @@ struct menu;
* menu_create() - Creates a menu handle with default settings
*/
struct menu *menu_create(char *title, int timeout, int prompt,
void (*item_data_print)(void *));
void (*item_data_print)(void *),
char *(*item_choice)(void *),
void *item_choice_data);
/*
* menu_item_add() - Adds or replaces a menu item
......
......@@ -21,7 +21,9 @@
struct menu;
struct menu *menu_create(char *title, int timeout, int prompt,
void (*item_data_print)(void *));
void (*item_data_print)(void *),
char *(*item_choice)(void *),
void *item_choice_data);
int menu_default_set(struct menu *m, char *item_key);
int menu_get_choice(struct menu *m, void **choice);
int menu_item_add(struct menu *m, char *item_key, void *item_data);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment