From 162eda1e2f7e755fedd9cebdc638fd779d80e15f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Wed, 27 Oct 2004 01:08:48 +0000 Subject: [PATCH] Fixed a bug that would select a non-selectable entry when wrapping around the "cursor". Now disables serial output when the boot menu is shown. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@9528 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/kernel/boot/platform/bios_ia32/menu.cpp | 37 +++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/src/kernel/boot/platform/bios_ia32/menu.cpp b/src/kernel/boot/platform/bios_ia32/menu.cpp index 4eb13f009d..254f6688b6 100644 --- a/src/kernel/boot/platform/bios_ia32/menu.cpp +++ b/src/kernel/boot/platform/bios_ia32/menu.cpp @@ -250,6 +250,36 @@ draw_menu(Menu *menu) } +static int32 +first_selectable_item(Menu *menu) +{ + int32 index = -1; + MenuItem *item; + + while ((item = menu->ItemAt(++index)) != NULL) { + if (item->IsEnabled() && item->Type() != MENU_ITEM_SEPARATOR) + break; + } + + return index; +} + + +static int32 +last_selectable_item(Menu *menu) +{ + int32 index = menu->CountItems(); + MenuItem *item; + + while ((item = menu->ItemAt(--index)) != NULL) { + if (item->IsEnabled() && item->Type() != MENU_ITEM_SEPARATOR) + break; + } + + return index; +} + + static void run_menu(Menu *menu) { @@ -283,7 +313,7 @@ run_menu(Menu *menu) break; } if (selected < 0) - selected = menu->CountItems() - 1; + selected = last_selectable_item(menu); break; case BIOS_KEY_DOWN: while ((item = menu->ItemAt(++selected)) != NULL) { @@ -291,7 +321,7 @@ run_menu(Menu *menu) break; } if (selected >= menu->CountItems()) - selected = 0; + selected = first_selectable_item(menu); break; case BIOS_KEY_PAGE_UP: selected -= menu_height() - 1; @@ -428,9 +458,12 @@ void platform_run_menu(Menu *menu) { platform_switch_to_text_mode(); + serial_disable(); + // no serial output while we're playing on the console run_menu(menu); + serial_enable(); platform_switch_to_logo(); }