diff options
Diffstat (limited to 'common/menu.c')
| -rw-r--r-- | common/menu.c | 42 | 
1 files changed, 31 insertions, 11 deletions
| diff --git a/common/menu.c b/common/menu.c index 6b2a2db3e..322b75e62 100644 --- a/common/menu.c +++ b/common/menu.c @@ -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); |