static int updateMenu( int key, void ** paramPtr ) { int moved = 0; int MenuTop = (int)get_env(envgMenuTop); int MenuSelection = (int)get_env(envgMenuSelection); int MenuRow = (int)get_env(envgMenuRow); int MenuHeight = (int)get_env(envgMenuHeight); int MenuBottom = (int)get_env(envgMenuBottom); int MenuStart = (int)get_env(envgMenuStart); int MenuEnd = (int)get_env(envgMenuEnd); union { struct { unsigned int selectionUp : 1, selectionDown : 1, scrollUp : 1, scrollDown : 1; } f; unsigned int w; } draw = {{0}}; if ( gMenuItems == NULL ) return 0; switch ( key ) { case 0x4800: // Up Arrow { if ( MenuSelection != MenuTop ) draw.f.selectionUp = 1; else if ( MenuTop > 0 ) draw.f.scrollDown = 1; break; } case 0x5000: // Down Arrow { if ( MenuSelection != MenuBottom ) draw.f.selectionDown = 1; else if ( MenuBottom < (get_env(envgMenuItemCount) - 1) ) draw.f.scrollUp = 1; break; } default: break; } if ( draw.w ) { if ( draw.f.scrollUp ) { scollPage(0, MenuRow, 40, MenuRow + MenuHeight - 1, 0x07, 1, 1); MenuTop++; MenuBottom++; MenuStart++; MenuEnd++; draw.f.selectionDown = 1; } if ( draw.f.scrollDown ) { scollPage(0, MenuRow, 40, MenuRow + MenuHeight - 1, 0x07, 1, -1); MenuTop--; MenuBottom--; MenuStart--; MenuEnd--; draw.f.selectionUp = 1; } if ( draw.f.selectionUp || draw.f.selectionDown ) { CursorState cursorState; // Set cursor at current position, and clear inverse video. changeCursor( 0, MenuRow + MenuSelection - MenuTop, kCursorTypeHidden, &cursorState ); printMenuItem( &gMenuItems[MenuSelection], 0 ); if ( draw.f.selectionUp ) { MenuSelection--; if(( MenuSelection - MenuStart) == -1 ) { MenuStart--; MenuEnd--; } } else { MenuSelection++; if(( MenuSelection - ( MenuEnd - 1) - MenuStart) > 0 ) { MenuStart++; MenuEnd++; } } moveCursor( 0, MenuRow + MenuSelection - MenuTop ); printMenuItem( &gMenuItems[MenuSelection], 1 ); restoreCursor( &cursorState ); } *paramPtr = gMenuItems[MenuSelection].param; moved = 1; } safe_set_env(envgMenuSelection,MenuSelection); safe_set_env(envgMenuTop,MenuTop ); safe_set_env(envgMenuRow,MenuRow); safe_set_env(envgMenuHeight,MenuHeight); safe_set_env(envgMenuBottom,MenuBottom); safe_set_env(envgMenuStart,MenuStart); safe_set_env(envgMenuEnd,MenuEnd); return moved; }
static int updateMenu( int key, void ** paramPtr ) { int moved = 0; union { struct { unsigned int selectionUp : 1, selectionDown : 1, scrollUp : 1, scrollDown : 1; } f; unsigned int w; } draw = {{0}}; if ( gMenuItems == NULL ) return 0; if( bootArgs->Video.v_display == GRAPHICS_MODE ) { int res; // set navigation keys for horizontal layout as defaults int previous = 0x4B00; // left arrow int subsequent = 0x4D00; // right arrow int menu = 0x5000; // down arrow if ( gui.layout == VerticalLayout ) { // set navigation keys for vertical layout previous = 0x4800; // up arrow subsequent = 0x5000; // down arrow menu = 0x4B00; // right arrow } if ( key == previous ) { if ( gMenuSelection > gMenuTop ) draw.f.selectionUp = 1; else if ( gMenuTop > 0 ) draw.f.scrollDown = 1; } else if ( key == subsequent ) { if ( gMenuSelection != gMenuBottom) draw.f.selectionDown = 1; else if ( gMenuBottom < ( gMenuItemCount - 1 ) ) draw.f.scrollUp = 1; } else if ( key == menu ) { if ( gui.menu.draw ) updateInfoMenu(key); else drawInfoMenu(); } else if ( gui.menu.draw ) { res = updateInfoMenu(key); if ( res == CLOSE_INFO_MENU ) gui.menu.draw = false; else { shouldboot = ( res != DO_NOT_BOOT ); if ( shouldboot ) gui.menu.draw = false; switch (res) { case BOOT_NORMAL: gVerboseMode = false; gBootMode = kBootModeNormal; break; case BOOT_VERBOSE: gVerboseMode = true; gBootMode = kBootModeNormal; addBootArg(kVerboseModeFlag); break; case BOOT_IGNORECACHE: gVerboseMode = false; gBootMode = kBootModeNormal; addBootArg(kIgnoreCachesFlag); break; case BOOT_SINGLEUSER: gVerboseMode = true; gBootMode = kBootModeNormal; addBootArg(kSingleUserModeFlag); break; } } } } else { switch ( key ) { case 0x4800: // Up Arrow if ( gMenuSelection != gMenuTop ) draw.f.selectionUp = 1; else if ( gMenuTop > 0 ) draw.f.scrollDown = 1; break; case 0x5000: // Down Arrow if ( gMenuSelection != gMenuBottom ) draw.f.selectionDown = 1; else if ( gMenuBottom < (gMenuItemCount - 1) ) draw.f.scrollUp = 1; break; } } if ( draw.w ) { if ( draw.f.scrollUp ) { scollPage(0, gMenuRow, 40, gMenuRow + gMenuHeight - 1, 0x07, 1, 1); gMenuTop++; gMenuBottom++; gMenuStart++; gMenuEnd++; draw.f.selectionDown = 1; } if ( draw.f.scrollDown ) { scollPage(0, gMenuRow, 40, gMenuRow + gMenuHeight - 1, 0x07, 1, -1); gMenuTop--; gMenuBottom--; gMenuStart--; gMenuEnd--; draw.f.selectionUp = 1; } if ( draw.f.selectionUp || draw.f.selectionDown ) { CursorState cursorState; // Set cursor at current position, and clear inverse video. if( bootArgs->Video.v_display == VGA_TEXT_MODE ) { changeCursor( 0, gMenuRow + gMenuSelection - gMenuTop, kCursorTypeHidden, &cursorState ); printMenuItem( &gMenuItems[gMenuSelection], 0 ); } if ( draw.f.selectionUp ) { gMenuSelection--; if(( gMenuSelection - gMenuStart) == -1 ) { gMenuStart--; gMenuEnd--; } } else { gMenuSelection++; if(( gMenuSelection - ( gui.maxdevices - 1) - gMenuStart) > 0 ) { gMenuStart++; gMenuEnd++; } } if( bootArgs->Video.v_display == VGA_TEXT_MODE ) { moveCursor( 0, gMenuRow + gMenuSelection - gMenuTop ); printMenuItem( &gMenuItems[gMenuSelection], 1 ); restoreCursor( &cursorState ); } else drawDeviceList (gMenuStart, gMenuEnd, gMenuSelection); } *paramPtr = gMenuItems[gMenuSelection].param; moved = 1; } return moved; }
static int updateMenu( int key, void ** paramPtr ) { int moved = 0; union { struct { unsigned int selectionUp : 1, selectionDown : 1, scrollUp : 1, scrollDown : 1; } f; unsigned int w; } draw = {{0}}; if ( NULL == gMenuItems ) return 0; // Look at the scan code. switch ( key ) { case 0x4800: // Up Arrow if ( gMenuSelection != gMenuTop ) draw.f.selectionUp = 1; else if ( gMenuTop > 0 ) draw.f.scrollDown = 1; break; case 0x5000: // Down Arrow if ( gMenuSelection != gMenuBottom ) draw.f.selectionDown = 1; else if ( gMenuBottom < (gMenuItemCount - 1) ) draw.f.scrollUp = 1; break; } if ( draw.w ) { if ( draw.f.scrollUp ) { scollPage(0, gMenuRow, 40, gMenuRow + gMenuHeight - 1, 0x07, 1, 1); gMenuTop++; gMenuBottom++; draw.f.selectionDown = 1; } if ( draw.f.scrollDown ) { scollPage(0, gMenuRow, 40, gMenuRow + gMenuHeight - 1, 0x07, 1, -1); gMenuTop--; gMenuBottom--; draw.f.selectionUp = 1; } if ( draw.f.selectionUp || draw.f.selectionDown ) { CursorState cursorState; // Set cursor at current position, and clear inverse video. changeCursor( 0, gMenuRow + gMenuSelection - gMenuTop, kCursorTypeHidden, &cursorState ); printMenuItem( &gMenuItems[gMenuSelection], 0 ); if ( draw.f.selectionUp ) gMenuSelection--; else gMenuSelection++; moveCursor( 0, gMenuRow + gMenuSelection - gMenuTop ); printMenuItem( &gMenuItems[gMenuSelection], 1 ); restoreCursor( &cursorState ); } *paramPtr = gMenuItems[gMenuSelection].param; moved = 1; } return moved; }