diff --git a/include/arm9/menu.h b/include/arm9/menu.h index df6238b..5d548eb 100644 --- a/include/arm9/menu.h +++ b/include/arm9/menu.h @@ -46,11 +46,16 @@ &menu_nand // STATE_NAND_MENU }; +enum menu_events { + MENU_EVENT_NONE = 0, + MENU_EVENT_HOME_PRESSED +}; + // PrintConsole for each screen extern PrintConsole con_top, con_bottom; int enter_menu(void); -void menuUpdateGlobalState(void); +int menuUpdateGlobalState(void); diff --git a/source/arm9/filebrowse.c b/source/arm9/filebrowse.c index 8235831..d9b3898 100644 --- a/source/arm9/filebrowse.c +++ b/source/arm9/filebrowse.c @@ -139,8 +139,7 @@ return; } - if(cursor_pos <= maxEntries) - old_cursor_pos = cursor_pos; + old_cursor_pos = cursor_pos; char entry [maxLen]; // should be safe unsigned start, end; @@ -205,30 +204,33 @@ if(curEntriesCount != 0) { - if(keys & KEY_DUP) + if(keys & KEY_DUP || keys & KEY_DLEFT) { if(cursor_pos != 0) { - cursor_pos--; + cursor_pos -= keys & KEY_DLEFT ? min(cursor_pos, 8) : 1; updateScreen(cursor_pos, false); } } - else if(keys & KEY_DDOWN) + + else if(keys & KEY_DDOWN || keys & KEY_DRIGHT) { // we reached the end of our entries list? - if(cursor_pos == curEntriesCount - 1) + u32 old_pos = cursor_pos; + cursor_pos += keys & KEY_DRIGHT ? 8 : 1; + if(cursor_pos >= curEntriesCount) { scanDirectory(); // we got more entries? - if(cursor_pos < curEntriesCount - 1) - { - cursor_pos++; + if(curEntriesCount > cursor_pos) + cursor_pos = min(cursor_pos, curEntriesCount - 1); + else + cursor_pos = curEntriesCount - 1; + if(cursor_pos != old_pos) updateScreen(cursor_pos, false); - } } else { - cursor_pos++; updateScreen(cursor_pos, false); } } diff --git a/source/arm9/menu.c b/source/arm9/menu.c index d694226..60a2096 100644 --- a/source/arm9/menu.c +++ b/source/arm9/menu.c @@ -208,7 +208,18 @@ default: printf("OOPS!\n"); break; } - menuUpdateGlobalState(); + switch(menuUpdateGlobalState()) + { + case MENU_EVENT_HOME_PRESSED: + menu_state = STATE_MAIN; + previous_states_count = 0; + consoleClear(); + cursor_pos = 0; + break; + + default: + break; + } // Later if PXI interrupts are implemented we need an // interrupt handler here which can tell the timer and @@ -223,8 +234,10 @@ return 0; } -void menuUpdateGlobalState(void) +int menuUpdateGlobalState(void) { + int retcode = MENU_EVENT_NONE; + /* Check PXI Response register */ bool successFlag; u32 replyCode = PXI_tryRecvWord(&successFlag); @@ -234,6 +247,7 @@ switch(replyCode) { case PXI_RPL_HOME_PRESSED: + retcode = MENU_EVENT_HOME_PRESSED; break; default: panic(); @@ -241,4 +255,6 @@ // maybe there's more..? replyCode = PXI_tryRecvWord(&successFlag); } + + return retcode; } diff --git a/source/arm9/pxi.c b/source/arm9/pxi.c index cdce95b..a8daebb 100644 --- a/source/arm9/pxi.c +++ b/source/arm9/pxi.c @@ -34,7 +34,7 @@ u32 PXI_tryRecvWord(bool *success) { - if(REG_PXI_CNT9 & PXI_RECV_FIFO_EMPTY); + if(REG_PXI_CNT9 & PXI_RECV_FIFO_EMPTY) { *success = false; return 0;