u32 ReGBA_Menu(enum ReGBA_MenuEntryReason EntryReason) { SDL_PauseAudio(SDL_ENABLE); ScaleModeUnapplied(); struct Menu* ActiveMenu = &MainMenu; if (MainMenu.InitFunction != NULL) (*(MainMenu.InitFunction))(&MainMenu); while (ActiveMenu != NULL) { // Draw. MenuFunction DisplayBackgroundFunction = ActiveMenu->DisplayBackgroundFunction; if (DisplayBackgroundFunction == NULL) DisplayBackgroundFunction = DefaultDisplayBackgroundFunction; (*DisplayBackgroundFunction)(ActiveMenu); MenuFunction DisplayTitleFunction = ActiveMenu->DisplayTitleFunction; if (DisplayTitleFunction == NULL) DisplayTitleFunction = DefaultDisplayTitleFunction; (*DisplayTitleFunction)(ActiveMenu); MenuEntryFunction DisplayDataFunction = ActiveMenu->DisplayDataFunction; if (DisplayDataFunction == NULL) DisplayDataFunction = DefaultDisplayDataFunction; (*DisplayDataFunction)(ActiveMenu, ActiveMenu->Entries[ActiveMenu->ActiveEntryIndex]); SDL_Flip(OutputSurface); // Wait. (This is for platforms on which flips don't wait for vertical // sync.) usleep(5000); struct Menu* PreviousMenu = ActiveMenu; // Get input. enum GUI_Action Action = GetGUIAction(); switch (Action) { case GUI_ACTION_ENTER: { MenuModifyFunction ButtonEnterFunction = ActiveMenu->Entries[ActiveMenu->ActiveEntryIndex]->ButtonEnterFunction; if (ButtonEnterFunction == NULL) ButtonEnterFunction = DefaultEnterFunction; (*ButtonEnterFunction)(&ActiveMenu, &ActiveMenu->ActiveEntryIndex); break; } case GUI_ACTION_LEAVE: { MenuModifyFunction ButtonLeaveFunction = ActiveMenu->ButtonLeaveFunction; if (ButtonLeaveFunction == NULL) ButtonLeaveFunction = DefaultLeaveFunction; (*ButtonLeaveFunction)(&ActiveMenu, &ActiveMenu->ActiveEntryIndex); break; } case GUI_ACTION_UP: { MenuModifyFunction ButtonUpFunction = ActiveMenu->ButtonUpFunction; if (ButtonUpFunction == NULL) ButtonUpFunction = DefaultUpFunction; (*ButtonUpFunction)(&ActiveMenu, &ActiveMenu->ActiveEntryIndex); break; } case GUI_ACTION_DOWN: { MenuModifyFunction ButtonDownFunction = ActiveMenu->ButtonDownFunction; if (ButtonDownFunction == NULL) ButtonDownFunction = DefaultDownFunction; (*ButtonDownFunction)(&ActiveMenu, &ActiveMenu->ActiveEntryIndex); break; } case GUI_ACTION_LEFT: { MenuEntryFunction ButtonLeftFunction = ActiveMenu->Entries[ActiveMenu->ActiveEntryIndex]->ButtonLeftFunction; if (ButtonLeftFunction == NULL) ButtonLeftFunction = DefaultLeftFunction; (*ButtonLeftFunction)(ActiveMenu, ActiveMenu->Entries[ActiveMenu->ActiveEntryIndex]); break; } case GUI_ACTION_RIGHT: { MenuEntryFunction ButtonRightFunction = ActiveMenu->Entries[ActiveMenu->ActiveEntryIndex]->ButtonRightFunction; if (ButtonRightFunction == NULL) ButtonRightFunction = DefaultRightFunction; (*ButtonRightFunction)(ActiveMenu, ActiveMenu->Entries[ActiveMenu->ActiveEntryIndex]); break; } default: break; } // Possibly finalise this menu and activate and initialise a new one. if (ActiveMenu != PreviousMenu) { if (PreviousMenu->EndFunction != NULL) (*(PreviousMenu->EndFunction))(PreviousMenu); if (ActiveMenu != NULL && ActiveMenu->InitFunction != NULL) (*(ActiveMenu->InitFunction))(ActiveMenu); } } // Avoid leaving the menu with GBA keys pressed (namely the one bound to // the native exit button, B). while (ReGBA_GetPressedButtons() != 0) { // Draw. SDL_Flip(OutputSurface); // Wait. (This is for platforms on which flips don't wait for vertical // sync.) usleep(5000); } SDL_PauseAudio(SDL_DISABLE); StatsStopFPS(); timespec Now; clock_gettime(CLOCK_MONOTONIC, &Now); Stats.LastFPSCalculationTime = Now; return 0; }
void StatsInit(void) { StatsStopFPS(); }