VSH: Insert and eject UMDs from the pause screen

While the XMB is running, the pause screen offers "Insert UMD" with the
drive empty, opening the Switch UMD game picker, and "Eject UMD" with a disc
in. The XMB notices the change through its drive callback, as it does over
the debugger's game.umd.insert/eject. Games keep "Switch UMD".

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Henrik RydgårdandClaude Opus 5.5 committed 2026-10-21 17:32:43 +02:00
1 parent 71974b2eab
commit 7d2663bf73
6 files changed
+40 -3

No files matched your search

+14 -1
View File
@@ -46,6 +46,7 @@
#include "Core/RetroAchievements.h"
#include "Core/ELF/ParamSFO.h"
#include "Core/HLE/sceDisplay.h"
#include "Core/HLE/sceKernelModule.h"
#include "Core/HLE/sceUmd.h"
#include "Core/HLE/sceNet.h"
#include "Core/HLE/sceNetInet.h"
@@ -712,7 +713,19 @@ void GamePauseScreen::CreateViews() {
buttonColumn->Add(rightColumnItems);
rightColumnItems->SetSpacing(0.0f);
if (getUMDReplacePermit()) {
if (__KernelIsRunningVSH()) {
// The XMB notices discs coming and going by itself, like a PSP's.
if (__UmdIsInserted()) {
rightColumnItems->Add(new Choice(pa->T("Eject UMD"), ImageID("I_UMD")))->OnClick.Add([this](UI::EventParams &) {
__UmdEject();
RecreateViews();
});
} else {
rightColumnItems->Add(new Choice(pa->T("Insert UMD"), ImageID("I_UMD")))->OnClick.Add([this](UI::EventParams &) {
screenManager()->push(new UmdReplaceScreen(true));
});
}
} else if (getUMDReplacePermit()) {
rightColumnItems->Add(new Choice(pa->T("Switch UMD"), ImageID("I_UMD")))->OnClick.Add([this](UI::EventParams &) {
screenManager()->push(new UmdReplaceScreen());
});