diff --git a/src/core/hle/kernel/init/init_slab_setup.cpp b/src/core/hle/kernel/init/init_slab_setup.cpp index a0e20bbbb4..a685a142f5 100644 --- a/src/core/hle/kernel/init/init_slab_setup.cpp +++ b/src/core/hle/kernel/init/init_slab_setup.cpp @@ -83,7 +83,9 @@ constexpr size_t SlabCountKDeviceAddressSpace = 300; constexpr size_t SlabCountKSession = 1133; constexpr size_t SlabCountKLightSession = 100; constexpr size_t SlabCountKObjectName = 7; -constexpr size_t SlabCountKResourceLimit = 5; +// Slight divergence to allow for uLaunch to work properly +// TODO(lizzie): This should be 5, shouldn't it? +constexpr size_t SlabCountKResourceLimit = 5 + 8; constexpr size_t SlabCountKDebug = Core::Hardware::NUM_CPU_CORES; constexpr size_t SlabCountKIoPool = 1; constexpr size_t SlabCountKIoRegion = 6; diff --git a/src/core/hle/service/am/applet_manager.cpp b/src/core/hle/service/am/applet_manager.cpp index badf776082..6d27285b05 100644 --- a/src/core/hle/service/am/applet_manager.cpp +++ b/src/core/hle/service/am/applet_manager.cpp @@ -407,7 +407,7 @@ void AppletManager::SetWindowSystem(WindowSystem* window_system) { // Applet was started by frontend, so it is foreground. applet->lifecycle_manager.SetFocusState(FocusState::InFocus); - if (applet->applet_id == AppletId::QLaunch) { + if (applet->applet_id == AppletId::QLaunch || applet->applet_id == AppletId::UlauncherUmenu) { applet->lifecycle_manager.SetFocusHandlingMode(false); applet->lifecycle_manager.SetOutOfFocusSuspendingEnabled(false); m_window_system->TrackApplet(applet, false); diff --git a/src/core/hle/service/am/service/library_applet_self_accessor.cpp b/src/core/hle/service/am/service/library_applet_self_accessor.cpp index fc427173f4..d571bec3ba 100644 --- a/src/core/hle/service/am/service/library_applet_self_accessor.cpp +++ b/src/core/hle/service/am/service/library_applet_self_accessor.cpp @@ -16,6 +16,7 @@ #include "core/hle/service/am/process_creation.h" #include "core/hle/service/am/service/library_applet_self_accessor.h" #include "core/hle/service/am/service/storage.h" +#include "core/hle/service/am/window_system.h" #include "core/hle/service/cmif_serialization.h" #include "core/hle/service/filesystem/filesystem.h" #include "core/hle/service/glue/glue_manager.h" @@ -102,10 +103,9 @@ Result ILibraryAppletSelfAccessor::PopInData(Out> out_st // uLauncher emulation static Result UloaderCreateApplication(Core::System& system, u64 program_id) { - FileSys::VirtualFile nca_raw{}; // Get the program NCA from storage. auto& storage = system.GetContentProviderUnion(); - nca_raw = storage.GetEntryRaw(program_id, FileSys::ContentRecordType::Program); + FileSys::VirtualFile nca_raw = storage.GetEntryRaw(program_id, FileSys::ContentRecordType::Program); // Ensure we retrieved a program NCA. R_UNLESS(nca_raw != nullptr, ResultUnknown); std::vector control; @@ -118,7 +118,7 @@ static Result UloaderCreateApplication(Core::System& system, u64 program_id) { applet->applet_id = AppletId::Application; applet->type = AppletType::Application; applet->library_applet_mode = LibraryAppletMode::AllForeground; - //window_system.TrackApplet(applet, true); + system.GetAppletManager().GetWindowSystem()->TrackApplet(applet, true); R_SUCCEED(); } @@ -176,9 +176,8 @@ Result ILibraryAppletSelfAccessor::PushOutData(SharedPointer storage) u64 args_value{}; std::memcpy(std::addressof(args_value), req_data.data() + sizeof(req_cmd), sizeof(args_value)); LOG_WARNING(Service_AM, "program_id={:016x}", args_value); - m_applet->process->Terminate(); UloaderCreateApplication(system, args_value); - R_SUCCEED(); + break; } case SystemMessage::ResumeApplication: case SystemMessage::TerminateApplication: @@ -203,6 +202,8 @@ Result ILibraryAppletSelfAccessor::PushOutData(SharedPointer storage) case SystemMessage::NotifyWarnedAboutOutdatedTheme: break; case SystemMessage::TerminateMenu: + m_applet->process->Terminate(); + system.GetAppletManager().GetWindowSystem()->RequestApplicationToGetForeground(); break; case SystemMessage::OpenControllerKeyRemapping: break; diff --git a/src/core/hle/service/am/window_system.cpp b/src/core/hle/service/am/window_system.cpp index 5f20a98322..c40011f702 100644 --- a/src/core/hle/service/am/window_system.cpp +++ b/src/core/hle/service/am/window_system.cpp @@ -59,7 +59,7 @@ void WindowSystem::Update() { void WindowSystem::TrackApplet(std::shared_ptr applet, bool is_application) { std::scoped_lock lk{m_lock}; - if (applet->applet_id == AppletId::QLaunch) { + if (applet->applet_id == AppletId::QLaunch || applet->applet_id == AppletId::UlauncherUmenu) { ASSERT(m_home_menu == nullptr); m_home_menu = applet.get(); } else if (applet->applet_id == AppletId::OverlayDisplay) { diff --git a/src/yuzu/main_window.cpp b/src/yuzu/main_window.cpp index 7ed0289fb0..c2e6473c51 100644 --- a/src/yuzu/main_window.cpp +++ b/src/yuzu/main_window.cpp @@ -595,8 +595,9 @@ MainWindow::MainWindow(bool has_broken_vulkan) std::filesystem::path const sd_dir = Common::FS::GetEdenPathString(Common::FS::EdenPath::SDMCDir); auto const path = (sd_dir / "ulaunch" / "bin" / "uMenu" / "main").string(); auto const program_id = 0x010000000000FFFF; - auto params = LibraryAppletParameters(program_id, Service::AM::AppletId::UlauncherUmenu); - params.launch_type = Service::AM::LaunchType::FrontendInitiated; + auto const applet_id = Service::AM::AppletId::UlauncherUmenu; + auto params = LibraryAppletParameters(program_id, applet_id); + QtCommon::system->GetFrontendAppletHolder().SetCurrentAppletId(applet_id); BootGame(QString::fromStdString(path), params); } }