mirror of
https://github.com/xcat2/xNBA.git
synced 2024-11-23 01:51:58 +00:00
[menu] Prevent separators with shortcut keys from being selected
Nothing currently prevents a menu separator from being assigned a shortcut key, and then from being selected using that shortcut key. This produces an inconsistency in the user interface, since separators cannot be selected by other means of menu navigation (arrow keys, page up/down, etc). It would be trivial to prevent separators from being assigned shortcut keys, but this would eliminate one potentially useful use case: having a large menu and using shortcut keys to jump to a section within the menu. Fix by treating a shortcut key on a separator as equivalent to "select the separator, then press the down arrow key". This has the effect of moving to the first non-separator menu item following the specified separator, which is probably the most intuitive behaviour. (The existing logic for moving the selection already handles the various nasty corner cases such as a menu ending with one or more separators.) Reported-by: Ján ONDREJ (SAL) <ondrejj@salstar.sk> Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
parent
b8cbdbbb53
commit
c08025137b
@ -247,13 +247,17 @@ static int menu_loop ( struct menu_ui *ui, struct menu_item **selected ) {
|
||||
i = 0;
|
||||
list_for_each_entry ( item, &ui->menu->items,
|
||||
list ) {
|
||||
if ( item->shortcut &&
|
||||
( item->shortcut == key ) ) {
|
||||
ui->selected = i;
|
||||
chosen = 1;
|
||||
break;
|
||||
if ( ! ( item->shortcut &&
|
||||
( item->shortcut == key ) ) ) {
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
ui->selected = i;
|
||||
if ( item->label ) {
|
||||
chosen = 1;
|
||||
} else {
|
||||
move = +1;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -284,12 +288,10 @@ static int menu_loop ( struct menu_ui *ui, struct menu_item **selected ) {
|
||||
draw_menu_item ( ui, ui->selected );
|
||||
}
|
||||
|
||||
/* Refuse to choose unlabelled items (i.e. separators) */
|
||||
item = menu_item ( ui->menu, ui->selected );
|
||||
if ( ! item->label )
|
||||
chosen = 0;
|
||||
|
||||
/* Record selection */
|
||||
item = menu_item ( ui->menu, ui->selected );
|
||||
assert ( item != NULL );
|
||||
assert ( item->label != NULL );
|
||||
*selected = item;
|
||||
|
||||
} while ( ( rc == 0 ) && ! chosen );
|
||||
|
Loading…
Reference in New Issue
Block a user