u32 ProcessMenu(MenuInfo* info, u32 n_entries_main) { MenuInfo* currMenu; MenuInfo* prevMenu[MENU_MAX_DEPTH]; u32 prevIndex[MENU_MAX_DEPTH]; u32 menuLvlMin; u32 menuLvl; u32 index = 0; u32 result = MENU_EXIT_REBOOT; #ifndef USE_THEME MenuInfo mainMenu; if (n_entries_main > 1) { // build main menu structure from submenus if (n_entries_main > MENU_MAX_ENTRIES) // limit number of entries n_entries_main = MENU_MAX_ENTRIES; memset(&mainMenu, 0x00, sizeof(MenuInfo)); for (u32 i = 0; i < n_entries_main; i++) { mainMenu.entries[i].name = info[i].name; mainMenu.entries[i].function = NULL; mainMenu.entries[i].param = i; } mainMenu.n_entries = n_entries_main; #ifndef BUILD_NAME mainMenu.name = "Decrypt9 Main Menu"; #else mainMenu.name = BUILD_NAME; #endif currMenu = &mainMenu; menuLvlMin = 0; } else { currMenu = info; menuLvlMin = 1; } DrawMenu(currMenu, 0, true, false); #else currMenu = info; menuLvlMin = 1; LoadThemeGfxLogo(); LoadThemeGfxMenu(0); #endif menuLvl = menuLvlMin; // main processing loop while (true) { bool full_draw = true; u32 pad_state = InputWait(); if ((pad_state & BUTTON_A) && (currMenu->entries[index].function == NULL)) { if (menuLvl < MENU_MAX_DEPTH) { prevMenu[menuLvl] = currMenu; prevIndex[menuLvl] = index; menuLvl++; } currMenu = info + currMenu->entries[index].param; index = 0; } else if (pad_state & BUTTON_A) { pad_state = ProcessEntry(currMenu->entries + index); } else if ((pad_state & BUTTON_B) && (menuLvl > menuLvlMin)) { menuLvl--; currMenu = prevMenu[menuLvl]; index = prevIndex[menuLvl]; } else if (pad_state & BUTTON_DOWN) { index = (index == currMenu->n_entries - 1) ? 0 : index + 1; full_draw = false; } else if (pad_state & BUTTON_UP) { index = (index == 0) ? currMenu->n_entries - 1 : index - 1; full_draw = false; } else if ((pad_state & BUTTON_R1) && (menuLvl == 1)) { if (++currMenu - info >= n_entries_main) currMenu = info; index = 0; } else if ((pad_state & BUTTON_L1) && (menuLvl == 1)) { if (--currMenu < info) currMenu = info + n_entries_main - 1; index = 0; } else if (pad_state & BUTTON_SELECT) { pad_state = UnmountSd(); } else if (pad_state & BUTTON_X) { (pad_state & (BUTTON_LEFT | BUTTON_RIGHT)) ? BatchScreenshot(info, pad_state & BUTTON_RIGHT) : Screenshot(NULL); } else { full_draw = false; } if (pad_state & BUTTON_START) { result = (pad_state & BUTTON_LEFT) ? MENU_EXIT_POWEROFF : MENU_EXIT_REBOOT; break; } #ifndef USE_THEME DrawMenu(currMenu, index, full_draw, menuLvl > menuLvlMin); #else if (full_draw) LoadThemeGfxLogo(); LoadThemeGfxMenu(((currMenu - info) * 100) + index); #endif } return result; }
u32 ProcessMenu(MenuInfo* info, u32 n_entries_main) { MenuInfo mainMenu; MenuInfo* currMenu = &mainMenu; MenuInfo* prevMenu[MENU_MAX_DEPTH]; u32 prevIndex[MENU_MAX_DEPTH]; u32 index = 0; u32 menuLvl = 0; // build main menu structure from submenus memset(&mainMenu, 0x00, sizeof(MenuInfo)); for (u32 i = 0; i < n_entries_main && i < MENU_MAX_ENTRIES; i++) { mainMenu.entries[i].name = info[i].name; mainMenu.entries[i].function = NULL; mainMenu.entries[i].param = i; mainMenu.entries[i].dangerous = 0; mainMenu.entries[i].emunand = 0; } #ifndef BUILD_NAME mainMenu.name = "Decrypt9 Main Menu"; #else mainMenu.name = BUILD_NAME; #endif mainMenu.n_entries = (n_entries_main > MENU_MAX_ENTRIES) ? MENU_MAX_ENTRIES : n_entries_main; DrawMenu(&mainMenu, 0, true, false); // main processing loop while (true) { bool full_draw = true; u32 pad_state = InputWait(); if ((pad_state & BUTTON_A) && (currMenu->entries[index].function == NULL)) { if (menuLvl < MENU_MAX_DEPTH) { prevMenu[menuLvl] = currMenu; prevIndex[menuLvl] = index; menuLvl++; } currMenu = info + currMenu->entries[index].param; index = 0; } else if (pad_state & BUTTON_A) { pad_state = ProcessEntry(currMenu->entries + index); } else if ((pad_state & BUTTON_B) && (menuLvl > 0)) { menuLvl--; currMenu = prevMenu[menuLvl]; index = prevIndex[menuLvl]; } else if (pad_state & BUTTON_DOWN) { index = (index == currMenu->n_entries - 1) ? 0 : index + 1; full_draw = false; } else if (pad_state & BUTTON_UP) { index = (index == 0) ? currMenu->n_entries - 1 : index - 1; full_draw = false; } else if ((pad_state & BUTTON_R1) && (menuLvl == 1)) { if (++currMenu - info >= n_entries_main) currMenu = info; index = 0; } else if ((pad_state & BUTTON_L1) && (menuLvl == 1)) { if (--currMenu < info) currMenu = info + n_entries_main - 1; index = 0; } else if (pad_state & BUTTON_SELECT) { pad_state = UnmountSd(); } else if (pad_state & BUTTON_X) { Screenshot(NULL); } else { full_draw = false; } if (pad_state & BUTTON_START) { break; } DrawMenu(currMenu, index, full_draw, menuLvl > 0); } return 0; }