apt: Fix exiting to game list on application close. (#6353)
This commit is contained in:
parent
794d051f0c
commit
fbf53686c3
|
@ -108,8 +108,9 @@ void Thread::Stop() {
|
||||||
u32 tls_page = (tls_address - Memory::TLS_AREA_VADDR) / Memory::CITRA_PAGE_SIZE;
|
u32 tls_page = (tls_address - Memory::TLS_AREA_VADDR) / Memory::CITRA_PAGE_SIZE;
|
||||||
u32 tls_slot =
|
u32 tls_slot =
|
||||||
((tls_address - Memory::TLS_AREA_VADDR) % Memory::CITRA_PAGE_SIZE) / Memory::TLS_ENTRY_SIZE;
|
((tls_address - Memory::TLS_AREA_VADDR) % Memory::CITRA_PAGE_SIZE) / Memory::TLS_ENTRY_SIZE;
|
||||||
ASSERT(owner_process.lock());
|
if (auto process = owner_process.lock()) {
|
||||||
owner_process.lock()->tls_slots[tls_page].reset(tls_slot);
|
process->tls_slots[tls_page].reset(tls_slot);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ThreadManager::SwitchContext(Thread* new_thread) {
|
void ThreadManager::SwitchContext(Thread* new_thread) {
|
||||||
|
|
|
@ -882,7 +882,12 @@ ResultCode AppletManager::PrepareToCloseApplication(bool return_to_sys) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (application_close_target == AppletSlot::HomeMenu) {
|
if (application_close_target == AppletSlot::HomeMenu) {
|
||||||
EnsureHomeMenuLoaded();
|
// Real APT would make sure home menu is loaded here. However, this is only really
|
||||||
|
// needed if the home menu wasn't loaded in the first place. Since we want to
|
||||||
|
// preserve normal behavior when the user loaded the game directly without going
|
||||||
|
// through home menu, we skip this. Then, later we just close to the game list
|
||||||
|
// when the application finishes closing.
|
||||||
|
// EnsureHomeMenuLoaded();
|
||||||
}
|
}
|
||||||
|
|
||||||
return RESULT_SUCCESS;
|
return RESULT_SUCCESS;
|
||||||
|
@ -896,15 +901,21 @@ ResultCode AppletManager::CloseApplication(std::shared_ptr<Kernel::Object> objec
|
||||||
GetAppletSlot(AppletSlot::Application)->Reset();
|
GetAppletSlot(AppletSlot::Application)->Reset();
|
||||||
|
|
||||||
if (application_close_target != AppletSlot::Error) {
|
if (application_close_target != AppletSlot::Error) {
|
||||||
active_slot = application_close_target;
|
// If exiting to the home menu and it is not loaded, exit to game list.
|
||||||
|
if (application_close_target == AppletSlot::HomeMenu &&
|
||||||
|
!GetAppletSlot(application_close_target)->registered) {
|
||||||
|
system.RequestShutdown();
|
||||||
|
} else {
|
||||||
|
active_slot = application_close_target;
|
||||||
|
|
||||||
CancelAndSendParameter({
|
CancelAndSendParameter({
|
||||||
.sender_id = AppletId::Application,
|
.sender_id = AppletId::Application,
|
||||||
.destination_id = GetAppletSlot(application_close_target)->applet_id,
|
.destination_id = GetAppletSlot(application_close_target)->applet_id,
|
||||||
.signal = SignalType::WakeupByExit,
|
.signal = SignalType::WakeupByExit,
|
||||||
.object = std::move(object),
|
.object = std::move(object),
|
||||||
.buffer = buffer,
|
.buffer = buffer,
|
||||||
});
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Terminate the application process.
|
// TODO: Terminate the application process.
|
||||||
|
|
Reference in New Issue