diff options
Diffstat (limited to 'common/menu.c')
| -rw-r--r-- | common/menu.c | 44 | 
1 files changed, 42 insertions, 2 deletions
| diff --git a/common/menu.c b/common/menu.c index 5a2126aa01a..ae5afa14766 100644 --- a/common/menu.c +++ b/common/menu.c @@ -8,6 +8,7 @@  #include <cli.h>  #include <malloc.h>  #include <errno.h> +#include <linux/ctype.h>  #include <linux/delay.h>  #include <linux/list.h>  #include <watchdog.h> @@ -436,6 +437,29 @@ int menu_destroy(struct menu *m)  	return 1;  } +static int bootmenu_conv_shortcut_key(struct bootmenu_data *menu, int ichar) +{ +	int shortcut_key; + +	ichar = tolower(ichar); +	switch (ichar) { +	/* a-z for bootmenu entry > 9 */ +	case 'a' ... 'z': +		shortcut_key = ichar - 'a' + 9; +		break; +	/* 1-9 for bootmenu entry <= 9 */ +	case '1' ... '9': +		shortcut_key = ichar - '1'; +		break; +	/* Reserve 0 for last option (aka Exit) */ +	case '0': +	default: +		return -1; +	} + +	return shortcut_key; +} +  enum bootmenu_key bootmenu_autoboot_loop(struct bootmenu_data *menu,  					 struct cli_ch_state *cch)  { @@ -443,12 +467,12 @@ enum bootmenu_key bootmenu_autoboot_loop(struct bootmenu_data *menu,  	int i, c;  	while (menu->delay > 0) { +		int ichar; +  		if (ansi)  			printf(ANSI_CURSOR_POSITION, menu->count + 5, 3);  		printf("Hit any key to stop autoboot: %d ", menu->delay);  		for (i = 0; i < 100; ++i) { -			int ichar; -  			if (!tstc()) {  				schedule();  				mdelay(10); @@ -470,6 +494,11 @@ enum bootmenu_key bootmenu_autoboot_loop(struct bootmenu_data *menu,  			case 0x3: /* ^C */  				key = BKEY_QUIT;  				break; +			case 'A' ... 'Z': +			case 'a' ... 'z': +			case '0' ... '9': +				key = BKEY_SHORTCUT; +				break;  			default:  				key = BKEY_NONE;  				break; @@ -477,6 +506,9 @@ enum bootmenu_key bootmenu_autoboot_loop(struct bootmenu_data *menu,  			break;  		} +		if (key == BKEY_SHORTCUT) +			cch->shortcut_key = bootmenu_conv_shortcut_key(menu, ichar); +  		if (menu->delay < 0)  			break; @@ -524,6 +556,11 @@ enum bootmenu_key bootmenu_conv_key(int ichar)  	case ' ':  		key = BKEY_SPACE;  		break; +	case 'A' ... 'Z': +	case 'a' ... 'z': +	case '0' ... '9': +		key = BKEY_SHORTCUT; +		break;  	default:  		key = BKEY_NONE;  		break; @@ -554,5 +591,8 @@ enum bootmenu_key bootmenu_loop(struct bootmenu_data *menu,  	key = bootmenu_conv_key(c); +	if (key == BKEY_SHORTCUT) +		cch->shortcut_key = bootmenu_conv_shortcut_key(menu, c); +  	return key;  } | 
