diff options
Diffstat (limited to 'common/menu.c')
| -rw-r--r-- | common/menu.c | 40 | 
1 files changed, 32 insertions, 8 deletions
| diff --git a/common/menu.c b/common/menu.c index 56439374f..f00482336 100644 --- a/common/menu.c +++ b/common/menu.c @@ -43,6 +43,7 @@ struct menu_item {   */  struct menu {  	struct menu_item *default_item; +	int timeout;  	char *title;  	int prompt;  	void (*item_data_print)(void *); @@ -158,13 +159,29 @@ static inline struct menu_item *menu_item_by_key(struct menu *m,  }  /* + * Wait for the user to hit a key according to the timeout set for the menu. + * Returns 1 if the user hit a key, or 0 if the timeout expired. + */ +static inline int menu_interrupted(struct menu *m) +{ +	if (!m->timeout) +		return 0; + +	if (abortboot(m->timeout/10)) +		return 1; + +	return 0; +} + +/*   * Checks whether or not the default menu item should be used without - * prompting for a user choice.  If the menu is set to always prompt, return - * 0. Otherwise, return 1 to indicate we should use the default menu item. + * prompting for a user choice. If the menu is set to always prompt, or the + * user hits a key during the timeout period, return 0. Otherwise, return 1 to + * indicate we should use the default menu item.   */  static inline int menu_use_default(struct menu *m)  { -	return !m->prompt; +	return !m->prompt && !menu_interrupted(m);  }  /* @@ -250,7 +267,8 @@ int menu_default_set(struct menu *m, char *item_key)  /*   * menu_get_choice() - Returns the user's selected menu entry, or the default - * if the menu is set to not prompt. This is safe to call more than once. + * if the menu is set to not prompt or the timeout expires. This is safe to + * call more than once.   *   * m - Points to a menu created by menu_create().   * @@ -259,8 +277,8 @@ int menu_default_set(struct menu *m, char *item_key)   * written at the location it points to.   *   * Returns 1 if successful, -EINVAL if m or choice is NULL, -ENOENT if no - * default has been set and the menu is set to not prompt, or -EINTR if the - * user exits the menu via ^c. + * default has been set and the menu is set to not prompt or the timeout + * expires, or -EINTR if the user exits the menu via ^c.   */  int menu_get_choice(struct menu *m, void **choice)  { @@ -330,7 +348,12 @@ int menu_item_add(struct menu *m, char *item_key, void *item_data)   * list of menu items. It will be copied to internal storage, and is safe to   * discard after passing to menu_create().   * - * prompt - If 0, don't ask for user input. + * timeout - A delay in seconds to wait for user input. If 0, timeout is + * disabled, and the default choice will be returned unless prompt is 1. + * + * prompt - If 0, don't ask for user input unless there is an interrupted + * timeout. If 1, the user will be prompted for input regardless of the value + * of timeout.   *   * item_data_print - If not NULL, will be called for each item when the menu   * is displayed, with the pointer to the item's data passed as the argument. @@ -341,7 +364,7 @@ int menu_item_add(struct menu *m, char *item_key, void *item_data)   * 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 prompt, +struct menu *menu_create(char *title, int timeout, int prompt,  				void (*item_data_print)(void *))  {  	struct menu *m; @@ -353,6 +376,7 @@ struct menu *menu_create(char *title, int prompt,  	m->default_item = NULL;  	m->prompt = prompt; +	m->timeout = timeout;  	m->item_data_print = item_data_print;  	if (title) { |