diff --git a/Core/HLE/sceKernelThread.cpp b/Core/HLE/sceKernelThread.cpp index 3b6ef4a74f..d73593ae4d 100644 --- a/Core/HLE/sceKernelThread.cpp +++ b/Core/HLE/sceKernelThread.cpp @@ -3496,10 +3496,10 @@ void __KernelCallAddress(PSPThread *thread, u32 entryPoint, PSPAction *afterActi // Already paused when the callback was notified. thread->waitPausedForCallback = false; } else if (cbId > 0 && (thread->nt.status & THREADSTATUS_WAIT) != 0) { - if (waitTypeFuncs[thread->nt.waitType].beginFunc != NULL) { + if (waitTypeFuncs[thread->nt.waitType].beginFunc) { waitTypeFuncs[thread->nt.waitType].beginFunc(after->threadID, thread->currentCallbackId); } else { - ERROR_LOG_REPORT(Log::HLE, "Missing begin/restore funcs for wait type %d", thread->nt.waitType); + ERROR_LOG_REPORT(Log::HLE, "Missing begin/restore funcs for wait type %d (%s)", thread->nt.waitType, WaitTypeToString(thread->nt.waitType)); } } @@ -3658,10 +3658,11 @@ void __KernelReturnFromMipsCall(MIPSState *mips) { cur->currentMipscallId = call->savedId; if (cur->nt.waitType != WAITTYPE_NONE && (cur->nt.status & THREADSTATUS_WAIT) != 0 && call->cbId > 0) { - if (waitTypeFuncs[cur->nt.waitType].endFunc != NULL) + if (waitTypeFuncs[cur->nt.waitType].endFunc) { waitTypeFuncs[cur->nt.waitType].endFunc(cur->GetUID(), cur->currentCallbackId); - else - ERROR_LOG_REPORT(Log::HLE, "Missing begin/restore funcs for wait type %d", cur->nt.waitType); + } else { + ERROR_LOG_REPORT(Log::HLE, "Missing begin/restore funcs for wait type %d (%s)", cur->nt.waitType, WaitTypeToString(cur->nt.waitType)); + } } // If the wait ended (or there was none), the thread never gave up the CPU, so it shouldn't diff --git a/UI/FirmwareScreen.cpp b/UI/FirmwareScreen.cpp index 6de432b85d..782d9fdc53 100644 --- a/UI/FirmwareScreen.cpp +++ b/UI/FirmwareScreen.cpp @@ -151,6 +151,14 @@ void FirmwareScreen::CreateSettingsViews(UI::ViewGroup *parent) { }); } + auto di = GetI18NCategory(I18NCat::DIALOG); + + Choice *moreInfo = groups->Add(new ChoiceGroup())->Add(new Choice(di->T("More info"))); + moreInfo->OnClick.Add([](UI::EventParams &) { + System_LaunchUrl(LaunchUrlType::BROWSER_URL, "https://www.ppsspp.org/docs/getting-started/how-to-run-the-vsh/"); + }); + moreInfo->SetIconRight(ImageID("I_LINK_OUT")); + if (gameRunning) { groups->Add(new NoticeView(NoticeLevel::INFO, sy->T("FirmwareNeedsNoGame", "Stop the game to change the installed firmware"), "")); diff --git a/UI/ImposeHome.cpp b/UI/ImposeHome.cpp index 6d8faa4668..b4f8fa1af5 100644 --- a/UI/ImposeHome.cpp +++ b/UI/ImposeHome.cpp @@ -625,12 +625,14 @@ void ImposeHomeScreen::Choose(bool quit) { return; } // Like a PSP: the game's exit callback first, so it can clean up (and usually calls - // sceKernelExitGame itself). Without one, the game is just ended. The game still gets no input - // meanwhile, and "Please wait..." stays up until it's gone. + // sceKernelExitGame itself). Without one, the game is just ended. + // + // The game still shouldn't get input meanwhile (TODO: though nothing enforces this?) + // and "Please wait..." stays up until it's gone. state_ = State::QUITTING; if (!__KernelIsExitCallbackPending() && __KernelInvokeRegisteredExitCallback(__KernelCanExitToVSH())) { INFO_LOG(Log::System, "HOME: quitting, running the game's exit callback"); - deadline_ = time_now_d() + 10.0; + exitDeadline_ = time_now_d() + 4.0; } else { FinishQuit(); } @@ -659,14 +661,14 @@ ImposeHomeScreen::Action ImposeHomeScreen::Update(bool running, bool onTop) { } lastButtons_ = 0; if (!PSP_IsInited()) { - deadline_ = -1.0; + exitDeadline_ = -1.0; } return Action::NONE; } // A game whose exit callback never gets round to exiting: quit it anyway. - if (deadline_ >= 0.0 && time_now_d() > deadline_) { - deadline_ = -1.0; + if (exitDeadline_ >= 0.0 && time_now_d() > exitDeadline_) { + exitDeadline_ = -1.0; WARN_LOG(Log::System, "HOME: the exit callback didn't end the game, quitting it"); FinishQuit(); return TakeAction(); @@ -683,7 +685,7 @@ ImposeHomeScreen::Action ImposeHomeScreen::Update(bool running, bool onTop) { switch (state_) { case State::CLOSED: - if ((pressed & CTRL_HOME) && deadline_ < 0.0 && Available()) { + if ((pressed & CTRL_HOME) && exitDeadline_ < 0.0 && Available()) { Open(); } break; diff --git a/UI/ImposeHome.h b/UI/ImposeHome.h index d2b1ec5e73..26cff356be 100644 --- a/UI/ImposeHome.h +++ b/UI/ImposeHome.h @@ -66,7 +66,7 @@ private: bool yes_ = false; // Which option is highlighted. uint32_t lastButtons_ = 0; // After choosing Yes, while the game's exit callback runs: when to stop waiting and quit anyway. - double deadline_ = -1.0; + double exitDeadline_ = -1.0; Action pendingAction_ = Action::NONE; // Where Yes and No were last drawn, for touch. Bounds yesBounds_{};