From 442a131da7812dec5b8b51447d7feaace251562d Mon Sep 17 00:00:00 2001 From: PulkoMandy Date: Mon, 16 Mar 2020 16:27:33 +0100 Subject: [PATCH] bootloader: additional keyboard commands In the boot menu, tab cycles between the menu items. In the pager for logs, j and k allow to scroll the log (vim style keys). These allow using the pager and menu on Sun machines, where Openboot does not manage the keyboard arrow keys. It may be possible to get more low-level input from the keyboard openboot device, but I think it is not worth the effort for now, especially as we would need different handling for the local keyboard and for serial ports. Change-Id: I5fe74eb9f7a952ae49ae3c8a6bfae6ba4a16ae07 Reviewed-on: https://review.haiku-os.org/c/haiku/+/2368 Reviewed-by: waddlesplash --- src/system/boot/loader/pager.cpp | 4 +++ .../boot/platform/generic/text_menu.cpp | 31 +++++++++++++++++++ 2 files changed, 35 insertions(+) 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