diff --git a/src/system/boot/loader/pager.cpp b/src/system/boot/loader/pager.cpp index 24445e55f2..cb1dcae212 100644 --- a/src/system/boot/loader/pager.cpp +++ b/src/system/boot/loader/pager.cpp @@ -168,11 +168,15 @@ pager(const PagerTextSource& textSource) case TEXT_CONSOLE_KEY_DOWN: case TEXT_CONSOLE_KEY_RETURN: + case 'j': + case 'J': // next line topLine++; break; case TEXT_CONSOLE_KEY_UP: + case 'k': + case 'K': // previous line topLine--; break; diff --git a/src/system/boot/platform/generic/text_menu.cpp b/src/system/boot/platform/generic/text_menu.cpp index cb95420428..611268ce88 100644 --- a/src/system/boot/platform/generic/text_menu.cpp +++ b/src/system/boot/platform/generic/text_menu.cpp @@ -465,6 +465,37 @@ run_menu(Menu* menu) || key == TEXT_CONSOLE_KEY_SPACE) { if (item != NULL && invoke_item(menu, item, selected, key)) break; + } else if (key == '\t') { + if (item == NULL) + continue; + + int32 oldSelected = selected; + + // Use tab to cycle between items (on some platforms, arrow keys + // are not available) + selected = select_next_valid_item(menu, selected + 1); + + if (selected == oldSelected) + selected = first_selectable_item(menu); + + // check if selected has changed + if (selected != oldSelected) { + MenuItem *item = menu->ItemAt(selected); + if (item != NULL) + item->Select(true); + + make_item_visible(menu, selected); + // make sure that the new selected entry is visible + if (sMenuOffset > selected + || sMenuOffset + menu_height() <= selected) { + if (sMenuOffset > selected) + sMenuOffset = selected; + else + sMenuOffset = selected + 1 - menu_height(); + + draw_menu(menu); + } + } } else if (key == TEXT_CONSOLE_KEY_ESCAPE && menu->Type() != MAIN_MENU) { // escape key was hit