|
@@ -47,6 +47,8 @@ struct menu {
|
|
char *title;
|
|
char *title;
|
|
int prompt;
|
|
int prompt;
|
|
void (*item_data_print)(void *);
|
|
void (*item_data_print)(void *);
|
|
|
|
+ char *(*item_choice)(void *);
|
|
|
|
+ void *item_choice_data;
|
|
struct list_head items;
|
|
struct list_head items;
|
|
};
|
|
};
|
|
|
|
|
|
@@ -204,18 +206,26 @@ static inline int menu_interactive_choice(struct menu *m, void **choice)
|
|
|
|
|
|
menu_display(m);
|
|
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;
|
|
*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
|
|
* what must be entered to select an item, the item_data_print function should
|
|
* make it obvious what the key for each entry is.
|
|
* 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
|
|
* Returns a pointer to the menu if successful, or NULL if there is
|
|
* insufficient memory available to create the menu.
|
|
* insufficient memory available to create the menu.
|
|
*/
|
|
*/
|
|
struct menu *menu_create(char *title, int timeout, int prompt,
|
|
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;
|
|
struct menu *m;
|
|
|
|
|
|
@@ -365,6 +383,8 @@ struct menu *menu_create(char *title, int timeout, int prompt,
|
|
m->prompt = prompt;
|
|
m->prompt = prompt;
|
|
m->timeout = timeout;
|
|
m->timeout = timeout;
|
|
m->item_data_print = item_data_print;
|
|
m->item_data_print = item_data_print;
|
|
|
|
+ m->item_choice = item_choice;
|
|
|
|
+ m->item_choice_data = item_choice_data;
|
|
|
|
|
|
if (title) {
|
|
if (title) {
|
|
m->title = strdup(title);
|
|
m->title = strdup(title);
|