Add APT event hooking mechanism
This commit is contained in:
parent
e2f8011f69
commit
da680e0503
@ -37,6 +37,24 @@ enum {
|
|||||||
APTSIGNAL_ERROR = 11
|
APTSIGNAL_ERROR = 11
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
APTHOOK_ONSUSPEND = 0,
|
||||||
|
APTHOOK_ONRESTORE,
|
||||||
|
APTHOOK_ONSLEEP,
|
||||||
|
APTHOOK_ONWAKEUP,
|
||||||
|
APTHOOK_ONEXIT,
|
||||||
|
|
||||||
|
APTHOOK_COUNT,
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef void (*aptHookFn)(int hook, void* param);
|
||||||
|
|
||||||
|
typedef struct tag_aptHookCookie
|
||||||
|
{
|
||||||
|
struct tag_aptHookCookie* next;
|
||||||
|
aptHookFn callback;
|
||||||
|
void* param;
|
||||||
|
} aptHookCookie;
|
||||||
|
|
||||||
extern Handle aptEvents[3];
|
extern Handle aptEvents[3];
|
||||||
|
|
||||||
@ -54,6 +72,9 @@ void aptSignalReadyForSleep();
|
|||||||
NS_APPID aptGetMenuAppID();
|
NS_APPID aptGetMenuAppID();
|
||||||
bool aptMainLoop(); // Use like this in your main(): while (aptMainLoop()) { your code here... }
|
bool aptMainLoop(); // Use like this in your main(): while (aptMainLoop()) { your code here... }
|
||||||
|
|
||||||
|
void aptHook(aptHookCookie* cookie, aptHookFn callback, void* param);
|
||||||
|
void aptUnhook(aptHookCookie* cookie);
|
||||||
|
|
||||||
Result APT_GetLockHandle(Handle* handle, u16 flags, Handle* lockHandle);
|
Result APT_GetLockHandle(Handle* handle, u16 flags, Handle* lockHandle);
|
||||||
Result APT_Initialize(Handle* handle, NS_APPID appId, Handle* eventHandle1, Handle* eventHandle2);
|
Result APT_Initialize(Handle* handle, NS_APPID appId, Handle* eventHandle1, Handle* eventHandle2);
|
||||||
Result APT_Finalize(Handle* handle, NS_APPID appId);
|
Result APT_Finalize(Handle* handle, NS_APPID appId);
|
||||||
|
@ -48,6 +48,15 @@ static Handle __apt_launchapplet_inhandle;
|
|||||||
static u32 *__apt_launchapplet_parambuf;
|
static u32 *__apt_launchapplet_parambuf;
|
||||||
static u32 __apt_launchapplet_parambufsize;
|
static u32 __apt_launchapplet_parambufsize;
|
||||||
|
|
||||||
|
static aptHookCookie aptFirstHook;
|
||||||
|
|
||||||
|
static void aptCallHook(int hookType)
|
||||||
|
{
|
||||||
|
aptHookCookie* c;
|
||||||
|
for (c = &aptFirstHook; c && c->callback; c = c->next)
|
||||||
|
c->callback(hookType, c->param);
|
||||||
|
}
|
||||||
|
|
||||||
// The following function can be overriden in order to log APT signals and notifications for debugging purposes
|
// The following function can be overriden in order to log APT signals and notifications for debugging purposes
|
||||||
__attribute__((weak)) void _aptDebug(int a, int b)
|
__attribute__((weak)) void _aptDebug(int a, int b)
|
||||||
{
|
{
|
||||||
@ -558,9 +567,12 @@ bool aptMainLoop()
|
|||||||
case APP_RUNNING:
|
case APP_RUNNING:
|
||||||
return true;
|
return true;
|
||||||
case APP_EXITING:
|
case APP_EXITING:
|
||||||
|
aptCallHook(APTHOOK_ONEXIT);
|
||||||
return false;
|
return false;
|
||||||
case APP_SUSPENDING:
|
case APP_SUSPENDING:
|
||||||
|
aptCallHook(APTHOOK_ONSUSPEND);
|
||||||
aptReturnToMenu();
|
aptReturnToMenu();
|
||||||
|
aptCallHook(APTHOOK_ONRESTORE);
|
||||||
break;
|
break;
|
||||||
case APP_APPLETSTARTED:
|
case APP_APPLETSTARTED:
|
||||||
aptAppletStarted();
|
aptAppletStarted();
|
||||||
@ -569,17 +581,43 @@ bool aptMainLoop()
|
|||||||
aptAppletClosed();
|
aptAppletClosed();
|
||||||
break;
|
break;
|
||||||
case APP_PREPARE_SLEEPMODE:
|
case APP_PREPARE_SLEEPMODE:
|
||||||
|
aptCallHook(APTHOOK_ONSLEEP);
|
||||||
aptSignalReadyForSleep();
|
aptSignalReadyForSleep();
|
||||||
// Fall through
|
// Fall through
|
||||||
default:
|
default:
|
||||||
//case APP_NOTINITIALIZED:
|
//case APP_NOTINITIALIZED:
|
||||||
//case APP_SLEEPMODE:
|
//case APP_SLEEPMODE:
|
||||||
aptWaitStatusEvent();
|
aptWaitStatusEvent();
|
||||||
|
aptCallHook(APTHOOK_ONWAKEUP);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void aptHook(aptHookCookie* cookie, aptHookFn callback, void* param)
|
||||||
|
{
|
||||||
|
if (!callback) return;
|
||||||
|
|
||||||
|
aptHookCookie* hook = &aptFirstHook;
|
||||||
|
*cookie = *hook; // Structure copy.
|
||||||
|
hook->next = cookie;
|
||||||
|
hook->callback = callback;
|
||||||
|
hook->param = param;
|
||||||
|
}
|
||||||
|
|
||||||
|
void aptUnhook(aptHookCookie* cookie)
|
||||||
|
{
|
||||||
|
aptHookCookie* hook;
|
||||||
|
for (hook = &aptFirstHook; hook; hook = hook->next)
|
||||||
|
{
|
||||||
|
if (hook->next == cookie)
|
||||||
|
{
|
||||||
|
*hook = *cookie; // Structure copy.
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void aptAppStarted()
|
void aptAppStarted()
|
||||||
{
|
{
|
||||||
u8 buf1[4], buf2[4];
|
u8 buf1[4], buf2[4];
|
||||||
|
Loading…
Reference in New Issue
Block a user