1
0
mirror of https://xff.cz/git/u-boot/ synced 2025-09-01 00:32:04 +02:00

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: Pali Rohár <pali.rohar@gmail.com>
Signed-off-by: Anatolij Gustschin <agust@denx.de>
This commit is contained in:
Pali Rohár
2013-03-23 14:50:40 +00:00
committed by Anatolij Gustschin
parent 009d75ccc1
commit fc9d64ffcd
5 changed files with 41 additions and 15 deletions

View File

@@ -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);