From 511acfe82d8c45aba4280b41f205d921e3ea71bc Mon Sep 17 00:00:00 2001 From: Joshua Peisach Date: Sun, 29 Jun 2025 11:41:54 -0400 Subject: [PATCH] 3ds: implement apt hooks --- CMakeLists.txt | 1 + ISLE/3ds/apthooks.cpp | 24 ++++++++++++++++++++++++ ISLE/3ds/apthooks.h | 8 ++++++++ ISLE/isleapp.cpp | 8 ++++++++ ISLE/isleapp.h | 1 + 5 files changed, 42 insertions(+) create mode 100644 ISLE/3ds/apthooks.cpp create mode 100644 ISLE/3ds/apthooks.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 7fbdc80d..f5f4c965 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -647,6 +647,7 @@ set(CPACK_PACKAGE_DIRECTORY "dist") set(CPACK_PACKAGE_FILE_NAME "isle-${PROJECT_VERSION}-${ISLE_PACKAGE_NAME}-${CMAKE_SYSTEM_PROCESSOR}") if(NINTENDO_3DS) target_sources(isle PRIVATE + ISLE/3ds/apthooks.cpp ISLE/3ds/filesystem.cpp ) ctr_generate_smdh(isle.smdh diff --git a/ISLE/3ds/apthooks.cpp b/ISLE/3ds/apthooks.cpp new file mode 100644 index 00000000..68fa6bba --- /dev/null +++ b/ISLE/3ds/apthooks.cpp @@ -0,0 +1,24 @@ +#include "apthooks.h" + +#include "../isleapp.h" +#include "legomain.h" +#include "misc.h" + +void N3DS_AptHookCallback(APT_HookType hookType, void* param) +{ + switch (hookType) { + case APTHOOK_ONSLEEP: + case APTHOOK_ONSUSPEND: + Lego()->Pause(); + break; + case APTHOOK_ONWAKEUP: + case APTHOOK_ONRESTORE: + Lego()->Resume(); + break; + case APTHOOK_ONEXIT: + Lego()->CloseMainWindow(); + break; + default: + break; + } +} diff --git a/ISLE/3ds/apthooks.h b/ISLE/3ds/apthooks.h new file mode 100644 index 00000000..66aeacfb --- /dev/null +++ b/ISLE/3ds/apthooks.h @@ -0,0 +1,8 @@ +#ifndef N3DS_APTHOOKS_H +#define N3DS_APTHOOKS_H + +#include <3ds.h> + +void N3DS_AptHookCallback(APT_HookType hookType, void* param); + +#endif // N3DS_APTHOOKS_H diff --git a/ISLE/isleapp.cpp b/ISLE/isleapp.cpp index a460c899..acb6b40b 100644 --- a/ISLE/isleapp.cpp +++ b/ISLE/isleapp.cpp @@ -51,7 +51,10 @@ #endif #ifdef __3DS__ +#include "3ds/apthooks.h" #include "3ds/filesystem.h" + +aptHookCookie g_aptCookie; #endif DECOMP_SIZE_ASSERT(IsleApp, 0x8c) @@ -318,6 +321,11 @@ SDL_AppResult SDL_AppInit(void** appstate, int argc, char** argv) NULL ); #endif + +#ifdef __3DS__ + aptHook(&g_aptCookie, N3DS_AptHookCallback, NULL); +#endif + return SDL_APP_CONTINUE; } diff --git a/ISLE/isleapp.h b/ISLE/isleapp.h index dd7bfdb1..d0a7f523 100644 --- a/ISLE/isleapp.h +++ b/ISLE/isleapp.h @@ -96,6 +96,7 @@ class IsleApp { }; extern IsleApp* g_isle; +extern MxS32 g_closed; extern IDirect3DRMMiniwinDevice* GetD3DRMMiniwinDevice();