summaryrefslogtreecommitdiffstats
path: root/src/hci
diff options
context:
space:
mode:
authorSimon Rettberg2018-05-28 17:33:36 +0200
committerSimon Rettberg2018-05-28 17:33:36 +0200
commit0ccbe0bc2248f4467d8af979618a866cb98c7215 (patch)
tree3ec4a94c2fb53e1828b218b1c050b507bf1c308d /src/hci
parent[console] Add option to update margins and bg-image of vesa mode console (diff)
downloadipxe-0ccbe0bc2248f4467d8af979618a866cb98c7215.tar.gz
ipxe-0ccbe0bc2248f4467d8af979618a866cb98c7215.tar.xz
ipxe-0ccbe0bc2248f4467d8af979618a866cb98c7215.zip
[menu] Add --hidden option to create hotkey-only entries
Diffstat (limited to 'src/hci')
-rw-r--r--src/hci/commands/menu_cmd.c13
-rw-r--r--src/hci/tui/menu_ui.c13
2 files changed, 25 insertions, 1 deletions
diff --git a/src/hci/commands/menu_cmd.c b/src/hci/commands/menu_cmd.c
index 76bce8695..c8692f1a7 100644
--- a/src/hci/commands/menu_cmd.c
+++ b/src/hci/commands/menu_cmd.c
@@ -118,6 +118,8 @@ struct item_options {
int is_default;
/** Use as a separator */
int is_gap;
+ /** Don't show; hotkey only */
+ int is_hidden;
};
/** "item" option list */
@@ -130,6 +132,8 @@ static struct option_descriptor item_opts[] = {
struct item_options, is_default, parse_flag ),
OPTION_DESC ( "gap", 'g', no_argument,
struct item_options, is_gap, parse_flag ),
+ OPTION_DESC ( "hidden", 'i', no_argument,
+ struct item_options, is_hidden, parse_flag ),
};
/** "item" command descriptor */
@@ -160,6 +164,12 @@ static int item_exec ( int argc, char **argv ) {
if ( ! opts.is_gap )
label = argv[optind++]; /* May be NULL */
+ /* Hidden entry without label and shortcut is pointless */
+ if ( opts.is_hidden && ( ! opts.key || ! label || ! *label ) ) {
+ rc = -EINVAL;
+ goto err_invalid_argument;
+ }
+
/* Parse text, if present */
if ( optind < argc ) {
text = concat_args ( &argv[optind] );
@@ -175,7 +185,7 @@ static int item_exec ( int argc, char **argv ) {
/* Add menu item */
item = add_menu_item ( menu, label, ( text ? text : "" ),
- opts.key, opts.is_default );
+ opts.key, opts.is_default, opts.is_hidden );
if ( ! item ) {
rc = -ENOMEM;
goto err_add_menu_item;
@@ -188,6 +198,7 @@ static int item_exec ( int argc, char **argv ) {
err_parse_menu:
free ( text );
err_parse_text:
+ err_invalid_argument:
err_parse_options:
return rc;
}
diff --git a/src/hci/tui/menu_ui.c b/src/hci/tui/menu_ui.c
index f9dd9d100..cb4edbbc8 100644
--- a/src/hci/tui/menu_ui.c
+++ b/src/hci/tui/menu_ui.c
@@ -217,6 +217,8 @@ static int menu_loop ( struct menu_ui *ui, struct menu_item **selected ) {
break;
default:
i = 0;
+
+ /* Check for shortcut. Visible items */
list_for_each_entry ( item, &ui->menu->items,
list ) {
if ( ! ( item->shortcut &&
@@ -231,6 +233,16 @@ static int menu_loop ( struct menu_ui *ui, struct menu_item **selected ) {
move = +1;
}
}
+
+ /* Hidden items */
+ list_for_each_entry ( item, &ui->menu->hidden_items,
+ list ) {
+ if ( item->shortcut &&
+ ( item->shortcut == key ) ) {
+ *selected = item;
+ goto hidden_entry_selected;
+ }
+ }
break;
}
}
@@ -259,6 +271,7 @@ static int menu_loop ( struct menu_ui *ui, struct menu_item **selected ) {
} while ( ( rc == 0 ) && ! chosen );
+ hidden_entry_selected:
return rc;
}