mirror of
https://github.com/switchbrew/libnx.git
synced 2025-06-22 04:52:39 +02:00
Align code style for AM
This commit is contained in:
parent
6bf7eb84bf
commit
fee6b42963
@ -10,10 +10,8 @@ extern "C" {
|
|||||||
|
|
||||||
#include <switch/types.h>
|
#include <switch/types.h>
|
||||||
#include <switch/result.h>
|
#include <switch/result.h>
|
||||||
#include <switch/svc.h>
|
|
||||||
#include <switch/arm.h>
|
|
||||||
#include <switch/ipc.h>
|
|
||||||
|
|
||||||
|
#include <switch/kernel/svc.h>
|
||||||
#include <switch/kernel/tmem.h>
|
#include <switch/kernel/tmem.h>
|
||||||
#include <switch/kernel/shmem.h>
|
#include <switch/kernel/shmem.h>
|
||||||
#include <switch/kernel/mutex.h>
|
#include <switch/kernel/mutex.h>
|
||||||
@ -21,14 +19,14 @@ extern "C" {
|
|||||||
#include <switch/kernel/virtmem.h>
|
#include <switch/kernel/virtmem.h>
|
||||||
#include <switch/kernel/version.h>
|
#include <switch/kernel/version.h>
|
||||||
|
|
||||||
#include <switch/util/utf.h>
|
#include <switch/arm.h>
|
||||||
|
#include <switch/ipc.h>
|
||||||
|
|
||||||
#include <switch/services/sm.h>
|
#include <switch/services/sm.h>
|
||||||
#include <switch/services/fs.h>
|
#include <switch/services/fs.h>
|
||||||
#include <switch/services/acc.h>
|
#include <switch/services/acc.h>
|
||||||
#include <switch/services/apm.h>
|
#include <switch/services/apm.h>
|
||||||
#include <switch/services/applet.h>
|
#include <switch/services/applet.h>
|
||||||
#include <switch/services/binder.h>
|
|
||||||
#include <switch/services/bsd.h>
|
#include <switch/services/bsd.h>
|
||||||
#include <switch/services/fatal.h>
|
#include <switch/services/fatal.h>
|
||||||
#include <switch/services/usb.h>
|
#include <switch/services/usb.h>
|
||||||
@ -38,12 +36,15 @@ extern "C" {
|
|||||||
#include <switch/services/pm.h>
|
#include <switch/services/pm.h>
|
||||||
|
|
||||||
#include <switch/gfx/gfx.h>
|
#include <switch/gfx/gfx.h>
|
||||||
|
#include <switch/gfx/binder.h>
|
||||||
#include <switch/gfx/parcel.h>
|
#include <switch/gfx/parcel.h>
|
||||||
#include <switch/gfx/buffer_producer.h>
|
#include <switch/gfx/buffer_producer.h>
|
||||||
#include <switch/gfx/ioctl.h>
|
#include <switch/gfx/ioctl.h>
|
||||||
#include <switch/gfx/nvioctl.h>
|
#include <switch/gfx/nvioctl.h>
|
||||||
#include <switch/gfx/nvgfx.h>
|
#include <switch/gfx/nvgfx.h>
|
||||||
|
|
||||||
|
#include <switch/util/utf.h>
|
||||||
|
|
||||||
#include <switch/devices/console.h>
|
#include <switch/devices/console.h>
|
||||||
#include <switch/devices/usb_comms.h>
|
#include <switch/devices/usb_comms.h>
|
||||||
#include <switch/devices/fs_dev.h>
|
#include <switch/devices/fs_dev.h>
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "types.h"
|
#include "../types.h"
|
||||||
|
|
||||||
/// Pseudo handle for the current process
|
/// Pseudo handle for the current process
|
||||||
#define CUR_PROCESS_HANDLE 0xFFFF8001
|
#define CUR_PROCESS_HANDLE 0xFFFF8001
|
@ -1,39 +1,39 @@
|
|||||||
typedef enum
|
typedef enum {
|
||||||
{
|
AppletType_None = -2,
|
||||||
APPLET_TYPE_None = -2,
|
AppletType_Default = -1,
|
||||||
APPLET_TYPE_Default = -1,
|
AppletType_Application = 0,
|
||||||
APPLET_TYPE_Application = 0,
|
AppletType_SystemApplet = 1,
|
||||||
APPLET_TYPE_SystemApplet = 1,
|
AppletType_LibraryApplet = 2,
|
||||||
APPLET_TYPE_LibraryApplet = 2,
|
AppletType_OverlayApplet = 3,
|
||||||
APPLET_TYPE_OverlayApplet = 3,
|
AppletType_SystemApplication = 4,
|
||||||
APPLET_TYPE_SystemApplication = 4,
|
} AppletType;
|
||||||
} appletType;
|
|
||||||
|
|
||||||
typedef enum
|
typedef enum {
|
||||||
{
|
AppletOperationMode_Handheld = 0,
|
||||||
APPLET_OperationMode_Handheld = 0,
|
AppletOperationMode_Docked = 1,
|
||||||
APPLET_OperationMode_Docked = 1,
|
} AppletOperationMode;
|
||||||
} appletOperationMode;
|
|
||||||
|
|
||||||
/// applet hook types.
|
/// applet hook types.
|
||||||
typedef enum {
|
typedef enum {
|
||||||
APPLETHOOK_ONFOCUSSTATE = 0, ///< FocusState changed.
|
AppletHookType_OnFocusState = 0, ///< FocusState changed.
|
||||||
APPLETHOOK_ONOPERATIONMODE, ///< OperationMode changed.
|
AppletHookType_OnOperationMode, ///< OperationMode changed.
|
||||||
APPLETHOOK_ONPERFORMANCEMODE, ///< PerformanceMode changed.
|
AppletHookType_OnPerformanceMode, ///< PerformanceMode changed.
|
||||||
|
|
||||||
APPLETHOOK_COUNT, ///< Number of applet hook types.
|
AppletHookType_Max, ///< Number of applet hook types.
|
||||||
} applet_HookType;
|
} AppletHookType;
|
||||||
|
|
||||||
/// applet hook function.
|
/// applet hook function.
|
||||||
typedef void (*appletHookFn)(applet_HookType hook, void* param);
|
typedef void (*AppletHookFn)(AppletHookType hook, void* param);
|
||||||
|
|
||||||
/// applet hook cookie.
|
/// applet hook cookie.
|
||||||
typedef struct tag_appletHookCookie
|
typedef struct AppletHookCookie AppletHookCookie;
|
||||||
|
|
||||||
|
struct AppletHookCookie
|
||||||
{
|
{
|
||||||
struct tag_appletHookCookie* next; ///< Next cookie.
|
AppletHookCookie* next; ///< Next cookie.
|
||||||
appletHookFn callback; ///< Hook callback.
|
AppletHookFn callback; ///< Hook callback.
|
||||||
void* param; ///< Callback parameter.
|
void* param; ///< Callback parameter.
|
||||||
} appletHookCookie;
|
};
|
||||||
|
|
||||||
Result appletInitialize(void);
|
Result appletInitialize(void);
|
||||||
void appletExit(void);
|
void appletExit(void);
|
||||||
@ -55,15 +55,15 @@ bool appletMainLoop(void);
|
|||||||
* @param callback Function to call when applet's status changes.
|
* @param callback Function to call when applet's status changes.
|
||||||
* @param param User-defined parameter to pass to the callback.
|
* @param param User-defined parameter to pass to the callback.
|
||||||
*/
|
*/
|
||||||
void appletHook(appletHookCookie* cookie, appletHookFn callback, void* param);
|
void appletHook(AppletHookCookie* cookie, AppletHookFn callback, void* param);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Removes an applet status hook.
|
* @brief Removes an applet status hook.
|
||||||
* @param cookie Hook cookie to remove.
|
* @param cookie Hook cookie to remove.
|
||||||
*/
|
*/
|
||||||
void appletUnhook(appletHookCookie* cookie);
|
void appletUnhook(AppletHookCookie* cookie);
|
||||||
|
|
||||||
/// These return state which is updated by appletMainLoop() when notifications are received.
|
/// These return state which is updated by appletMainLoop() when notifications are received.
|
||||||
u8 appletGetOperationMode(void);
|
u8 appletGetOperationMode(void);
|
||||||
u32 appletGetPerformanceMode(void);
|
u32 appletGetPerformanceMode(void);
|
||||||
u8 appletGetFocusState(void);
|
u8 appletGetFocusState(void);
|
||||||
|
@ -26,7 +26,7 @@ size_t g_gfx_framebuf_height=0, g_gfx_framebuf_aligned_height=0;
|
|||||||
size_t g_gfx_framebuf_display_width=0, g_gfx_framebuf_display_height=0;
|
size_t g_gfx_framebuf_display_width=0, g_gfx_framebuf_display_height=0;
|
||||||
size_t g_gfx_singleframebuf_size=0;
|
size_t g_gfx_singleframebuf_size=0;
|
||||||
|
|
||||||
static appletHookCookie g_gfx_autoresolution_applethookcookie;
|
static AppletHookCookie g_gfx_autoresolution_applethookcookie;
|
||||||
static bool g_gfx_autoresolution_enabled;
|
static bool g_gfx_autoresolution_enabled;
|
||||||
|
|
||||||
static s32 g_gfx_autoresolution_handheld_width;
|
static s32 g_gfx_autoresolution_handheld_width;
|
||||||
@ -248,7 +248,7 @@ static Result _gfxInit(viServiceType servicetype, const char *DisplayName, u32 L
|
|||||||
if (R_SUCCEEDED(rc)) rc = _gfxDequeueBuffer();
|
if (R_SUCCEEDED(rc)) rc = _gfxDequeueBuffer();
|
||||||
|
|
||||||
if (R_SUCCEEDED(rc)) {
|
if (R_SUCCEEDED(rc)) {
|
||||||
if(__nx_applet_type == APPLET_TYPE_Application) { //It's unknown whether there's a better way to handle this.
|
if (__nx_applet_type == AppletType_Application) { //It's unknown whether there's a better way to handle this.
|
||||||
svcSleepThread(2000000000);
|
svcSleepThread(2000000000);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -295,34 +295,35 @@ static Result _gfxInit(viServiceType servicetype, const char *DisplayName, u32 L
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
void gfxInitDefault(void) {
|
void gfxInitDefault()
|
||||||
nvServiceType nv_servicetype = NVSERVTYPE_Default;
|
{
|
||||||
|
nvServiceType nv_servicetype;
|
||||||
|
|
||||||
if(__nx_applet_type != APPLET_TYPE_None) {
|
switch(__nx_applet_type) {
|
||||||
switch(__nx_applet_type) {
|
case AppletType_Application:
|
||||||
case APPLET_TYPE_Application:
|
case AppletType_SystemApplication:
|
||||||
case APPLET_TYPE_SystemApplication:
|
nv_servicetype = NVSERVTYPE_Application;
|
||||||
nv_servicetype = NVSERVTYPE_Application;
|
break;
|
||||||
break;
|
|
||||||
|
|
||||||
case APPLET_TYPE_SystemApplet:
|
case AppletType_SystemApplet:
|
||||||
case APPLET_TYPE_LibraryApplet:
|
case AppletType_LibraryApplet:
|
||||||
case APPLET_TYPE_OverlayApplet:
|
case AppletType_OverlayApplet:
|
||||||
nv_servicetype = NVSERVTYPE_Applet;
|
default:
|
||||||
break;
|
nv_servicetype = NVSERVTYPE_Applet;
|
||||||
}
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
Result rc = _gfxInit(VILAYERFLAGS_Default, "Default", VILAYERFLAGS_Default, 0, nv_servicetype, 0x300000);
|
Result rc = _gfxInit(VILAYERFLAGS_Default, "Default", VILAYERFLAGS_Default, 0, nv_servicetype, 0x300000);
|
||||||
if (R_FAILED(rc)) fatalSimple(rc);
|
if (R_FAILED(rc)) fatalSimple(rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
void gfxExit(void) {
|
void gfxExit() {
|
||||||
u32 i=0;
|
u32 i = 0;
|
||||||
if(!g_gfxInitialized)return;
|
if (!g_gfxInitialized)
|
||||||
|
return;
|
||||||
|
|
||||||
_gfxQueueBuffer(g_gfxCurrentProducerBuffer);
|
_gfxQueueBuffer(g_gfxCurrentProducerBuffer);
|
||||||
for(i=0; i<2; i++) {
|
for (i=0; i<2; i++) {
|
||||||
if (g_gfx_ProducerSlotsRequested[i]) bufferProducerDetachBuffer(i);
|
if (g_gfx_ProducerSlotsRequested[i]) bufferProducerDetachBuffer(i);
|
||||||
}
|
}
|
||||||
if (g_gfx_ProducerConnected) bufferProducerDisconnect(2);
|
if (g_gfx_ProducerConnected) bufferProducerDisconnect(2);
|
||||||
@ -401,17 +402,18 @@ void gfxConfigureResolution(s32 width, s32 height) {
|
|||||||
gfxConfigureCrop(0, 0, width, height);
|
gfxConfigureCrop(0, 0, width, height);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _gfxAutoResolutionAppletHook(applet_HookType hook, void* param) {
|
static void _gfxAutoResolutionAppletHook(AppletHookType hook, void* param) {
|
||||||
u8 mode=0;
|
u8 mode=0;
|
||||||
|
|
||||||
if (hook != APPLETHOOK_ONOPERATIONMODE) return;
|
if (hook != AppletHookType_OnOperationMode)
|
||||||
|
return;
|
||||||
|
|
||||||
mode = appletGetOperationMode();
|
mode = appletGetOperationMode();
|
||||||
|
|
||||||
if (mode == APPLET_OperationMode_Handheld) {
|
if (mode == AppletOperationMode_Handheld) {
|
||||||
gfxConfigureResolution(g_gfx_autoresolution_handheld_width, g_gfx_autoresolution_handheld_height);
|
gfxConfigureResolution(g_gfx_autoresolution_handheld_width, g_gfx_autoresolution_handheld_height);
|
||||||
}
|
}
|
||||||
else if(mode == APPLET_OperationMode_Docked) {
|
else if (mode == AppletOperationMode_Docked) {
|
||||||
gfxConfigureResolution(g_gfx_autoresolution_docked_width, g_gfx_autoresolution_docked_height);
|
gfxConfigureResolution(g_gfx_autoresolution_docked_width, g_gfx_autoresolution_docked_height);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -429,7 +431,7 @@ void gfxConfigureAutoResolution(bool enable, s32 handheld_width, s32 handheld_he
|
|||||||
g_gfx_autoresolution_docked_width = docked_width;
|
g_gfx_autoresolution_docked_width = docked_width;
|
||||||
g_gfx_autoresolution_docked_height = docked_height;
|
g_gfx_autoresolution_docked_height = docked_height;
|
||||||
|
|
||||||
if (enable) _gfxAutoResolutionAppletHook(APPLETHOOK_ONOPERATIONMODE, 0);
|
if (enable) _gfxAutoResolutionAppletHook(AppletHookType_OnOperationMode, 0);
|
||||||
if (!enable) gfxConfigureResolution(0, 0);
|
if (!enable) gfxConfigureResolution(0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <switch.h>
|
#include <switch.h>
|
||||||
|
|
||||||
__attribute__((weak)) u32 __nx_applet_type = APPLET_TYPE_Default;
|
__attribute__((weak)) u32 __nx_applet_type = AppletType_Default;
|
||||||
__attribute__((weak)) bool __nx_applet_auto_notifyrunning = true;
|
__attribute__((weak)) bool __nx_applet_auto_notifyrunning = true;
|
||||||
__attribute__((weak)) u8 __nx_applet_AppletAttribute[0x80];
|
__attribute__((weak)) u8 __nx_applet_AppletAttribute[0x80];
|
||||||
__attribute__((weak)) u32 __nx_applet_PerformanceConfiguration[2] = {/*0x92220008*//*0x20004*//*0x92220007*/0, 0};
|
__attribute__((weak)) u32 __nx_applet_PerformanceConfiguration[2] = {/*0x92220008*//*0x20004*//*0x92220007*/0, 0};
|
||||||
@ -9,7 +9,8 @@ __attribute__((weak)) u32 __nx_applet_PerformanceConfiguration[2] = {/*0x9222000
|
|||||||
static Handle g_appletServiceSession = INVALID_HANDLE;
|
static Handle g_appletServiceSession = INVALID_HANDLE;
|
||||||
static Handle g_appletProxySession = INVALID_HANDLE;
|
static Handle g_appletProxySession = INVALID_HANDLE;
|
||||||
|
|
||||||
static Handle g_appletIFunctions = INVALID_HANDLE;//From Get*Functions, for ILibraryAppletProxy this is GetLibraryAppletSelfAccessor
|
// From Get*Functions, for ILibraryAppletProxy. This is GetLibraryAppletSelfAccessor
|
||||||
|
static Handle g_appletIFunctions = INVALID_HANDLE;
|
||||||
|
|
||||||
static Handle g_appletILibraryAppletCreator = INVALID_HANDLE;
|
static Handle g_appletILibraryAppletCreator = INVALID_HANDLE;
|
||||||
static Handle g_appletICommonStateGetter = INVALID_HANDLE;
|
static Handle g_appletICommonStateGetter = INVALID_HANDLE;
|
||||||
@ -29,7 +30,7 @@ static u8 g_appletFocusState;
|
|||||||
|
|
||||||
static bool g_appletNotifiedRunning = 0;
|
static bool g_appletNotifiedRunning = 0;
|
||||||
|
|
||||||
static appletHookCookie appletFirstHook;
|
static AppletHookCookie g_appletFirstHook;
|
||||||
|
|
||||||
void appletExit(void);
|
void appletExit(void);
|
||||||
|
|
||||||
@ -52,126 +53,169 @@ static Result _appletGetPerformanceMode(u32 *out);
|
|||||||
static Result _appletSetOperationModeChangedNotification(u8 flag);
|
static Result _appletSetOperationModeChangedNotification(u8 flag);
|
||||||
static Result _appletSetPerformanceModeChangedNotification(u8 flag);
|
static Result _appletSetPerformanceModeChangedNotification(u8 flag);
|
||||||
|
|
||||||
Result appletInitialize(void) {
|
|
||||||
if (g_appletServiceSession != INVALID_HANDLE) return MAKERESULT(MODULE_LIBNX, LIBNX_ALREADYINITIALIZED);
|
Result appletInitialize(void)
|
||||||
|
{
|
||||||
|
if (g_appletServiceSession != INVALID_HANDLE)
|
||||||
|
return MAKERESULT(MODULE_LIBNX, LIBNX_ALREADYINITIALIZED);
|
||||||
|
|
||||||
|
if (__nx_applet_type==AppletType_None)
|
||||||
|
return 0;
|
||||||
|
|
||||||
Result rc = 0;
|
Result rc = 0;
|
||||||
Handle prochandle = CUR_PROCESS_HANDLE;
|
|
||||||
s32 tmpindex=0;
|
|
||||||
u32 i;
|
|
||||||
u32 msg=0;
|
|
||||||
|
|
||||||
if (__nx_applet_type==APPLET_TYPE_None) return 0;
|
|
||||||
|
|
||||||
g_appletResourceUserId = 0;
|
g_appletResourceUserId = 0;
|
||||||
g_appletNotifiedRunning = 0;
|
g_appletNotifiedRunning = 0;
|
||||||
|
|
||||||
if (__nx_applet_type==APPLET_TYPE_Default) __nx_applet_type = APPLET_TYPE_Application;
|
switch (__nx_applet_type) {
|
||||||
|
case AppletType_Default:
|
||||||
if (__nx_applet_type==APPLET_TYPE_Application) {
|
__nx_applet_type = AppletType_Application;
|
||||||
|
// Fallthrough.
|
||||||
|
case AppletType_Application:
|
||||||
rc = smGetService(&g_appletServiceSession, "appletOE");
|
rc = smGetService(&g_appletServiceSession, "appletOE");
|
||||||
}
|
break;
|
||||||
|
default:
|
||||||
if (__nx_applet_type!=APPLET_TYPE_Application) {
|
|
||||||
rc = smGetService(&g_appletServiceSession, "appletAE");
|
rc = smGetService(&g_appletServiceSession, "appletAE");
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (R_SUCCEEDED(rc)) {
|
if (R_SUCCEEDED(rc)) {
|
||||||
|
#define APT_BUSY_ERROR 0x19280
|
||||||
|
|
||||||
do {
|
do {
|
||||||
|
u32 cmd_id;
|
||||||
|
|
||||||
switch(__nx_applet_type) {
|
switch(__nx_applet_type) {
|
||||||
default:
|
case AppletType_Application: cmd_id = 0; break;
|
||||||
rc = MAKERESULT(MODULE_LIBNX, LIBNX_NOTFOUND);
|
case AppletType_SystemApplet: cmd_id = 100; break;
|
||||||
break;
|
case AppletType_LibraryApplet: cmd_id = 200; break;
|
||||||
|
case AppletType_OverlayApplet: cmd_id = 300; break;
|
||||||
case APPLET_TYPE_Application:
|
case AppletType_SystemApplication: cmd_id = 350; break;
|
||||||
rc = _appletGetSessionProxy(g_appletServiceSession, &g_appletProxySession, 0, prochandle, NULL);
|
default: fatalSimple(MAKERESULT(MODULE_LIBNX, LIBNX_NOTFOUND));
|
||||||
break;
|
|
||||||
|
|
||||||
case APPLET_TYPE_SystemApplet:
|
|
||||||
rc = _appletGetSessionProxy(g_appletServiceSession, &g_appletProxySession, 100, prochandle, NULL);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case APPLET_TYPE_LibraryApplet:
|
|
||||||
rc = _appletGetSessionProxy(g_appletServiceSession, &g_appletProxySession, /*201*/200, prochandle, /*__nx_applet_AppletAttribute*/NULL);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case APPLET_TYPE_OverlayApplet:
|
|
||||||
rc = _appletGetSessionProxy(g_appletServiceSession, &g_appletProxySession, 300, prochandle, NULL);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case APPLET_TYPE_SystemApplication:
|
|
||||||
rc = _appletGetSessionProxy(g_appletServiceSession, &g_appletProxySession, 350, prochandle, NULL);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((rc & 0x3fffff) == 0x19280) svcSleepThread(10000000);
|
rc = _appletGetSessionProxy(g_appletServiceSession, &g_appletProxySession, cmd_id, CUR_PROCESS_HANDLE, NULL);
|
||||||
} while((rc & 0x3fffff) == 0x19280);
|
|
||||||
|
if (rc == APT_BUSY_ERROR) {
|
||||||
|
svcSleepThread(10000000);
|
||||||
|
}
|
||||||
|
|
||||||
|
} while (rc == APT_BUSY_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (R_SUCCEEDED(rc)) rc = _appletGetSession(g_appletProxySession, &g_appletIFunctions, 20);//Get*Functions, for ILibraryAppletProxy this is GetLibraryAppletSelfAccessor
|
// Get*Functions, for ILibraryAppletProxy this is GetLibraryAppletSelfAccessor
|
||||||
//TODO: Add non-application type-specific session init here.
|
if (R_SUCCEEDED(rc))
|
||||||
|
rc = _appletGetSession(g_appletProxySession, &g_appletIFunctions, 20);
|
||||||
|
|
||||||
if (R_SUCCEEDED(rc)) rc = _appletGetSession(g_appletProxySession, &g_appletILibraryAppletCreator, 11);//GetLibraryAppletCreator
|
// TODO: Add non-application type-specific session init here.
|
||||||
if (R_SUCCEEDED(rc)) rc = _appletGetSession(g_appletProxySession, &g_appletICommonStateGetter, 0);//GetCommonStateGetter
|
|
||||||
if (R_SUCCEEDED(rc)) rc = _appletGetSession(g_appletProxySession, &g_appletISelfController, 1);//GetSelfController
|
|
||||||
if (R_SUCCEEDED(rc)) rc = _appletGetSession(g_appletProxySession, &g_appletIWindowController, 2);//GetWindowController (get GetAppletResourceUserId from this)
|
|
||||||
if (R_SUCCEEDED(rc)) rc = _appletGetAppletResourceUserId(&g_appletResourceUserId);
|
|
||||||
if (R_SUCCEEDED(rc)) rc = _appletGetSession(g_appletProxySession, &g_appletIAudioController, 3);//GetAudioController
|
|
||||||
if (R_SUCCEEDED(rc)) rc = _appletGetSession(g_appletProxySession, &g_appletIDisplayController, 4);//GetDisplayController
|
|
||||||
if (R_SUCCEEDED(rc)) rc = _appletGetSession(g_appletProxySession, &g_appletIDebugFunctions, 1000);//GetDebugFunctions
|
|
||||||
|
|
||||||
if (R_SUCCEEDED(rc) && __nx_applet_type==APPLET_TYPE_Application) {
|
// GetLibraryAppletCreator
|
||||||
rc = _appletGetSession(g_appletICommonStateGetter, &g_appletMessageEventHandle, 0);//Reuse _appletGetSession since ipc input/output is the same. (ICommonStateGetter GetEventHandle)
|
if (R_SUCCEEDED(rc))
|
||||||
|
rc = _appletGetSession(g_appletProxySession, &g_appletILibraryAppletCreator, 11);
|
||||||
|
// GetCommonStateGetter
|
||||||
|
if (R_SUCCEEDED(rc))
|
||||||
|
rc = _appletGetSession(g_appletProxySession, &g_appletICommonStateGetter, 0);
|
||||||
|
// GetSelfController
|
||||||
|
if (R_SUCCEEDED(rc))
|
||||||
|
rc = _appletGetSession(g_appletProxySession, &g_appletISelfController, 1);
|
||||||
|
// GetWindowController
|
||||||
|
if (R_SUCCEEDED(rc))
|
||||||
|
rc = _appletGetSession(g_appletProxySession, &g_appletIWindowController, 2);
|
||||||
|
// Get AppletResourceUserId.
|
||||||
|
if (R_SUCCEEDED(rc))
|
||||||
|
rc = _appletGetAppletResourceUserId(&g_appletResourceUserId);
|
||||||
|
// GetAudioController
|
||||||
|
if (R_SUCCEEDED(rc))
|
||||||
|
rc = _appletGetSession(g_appletProxySession, &g_appletIAudioController, 3);
|
||||||
|
// GetDisplayController
|
||||||
|
if (R_SUCCEEDED(rc))
|
||||||
|
rc = _appletGetSession(g_appletProxySession, &g_appletIDisplayController, 4);
|
||||||
|
// GetDebugFunctions
|
||||||
|
if (R_SUCCEEDED(rc))
|
||||||
|
rc = _appletGetSession(g_appletProxySession, &g_appletIDebugFunctions, 1000);
|
||||||
|
|
||||||
|
if (R_SUCCEEDED(rc) && (__nx_applet_type == AppletType_Application))
|
||||||
|
{
|
||||||
|
// Reuse _appletGetSession since ipc input/output is the same. This is ICommonStateGetter::GetEventHandle.
|
||||||
|
rc = _appletGetSession(g_appletICommonStateGetter, &g_appletMessageEventHandle, 0);
|
||||||
|
|
||||||
if (R_SUCCEEDED(rc)) {
|
if (R_SUCCEEDED(rc)) {
|
||||||
do {
|
do {
|
||||||
while(R_FAILED(svcWaitSynchronization(&tmpindex, &g_appletMessageEventHandle, 1, U64_MAX)));
|
s32 tmp_index=0;
|
||||||
|
svcWaitSynchronization(&tmp_index, &g_appletMessageEventHandle, 1, U64_MAX);
|
||||||
|
|
||||||
|
u32 msg;
|
||||||
rc = _appletReceiveMessage(&msg);
|
rc = _appletReceiveMessage(&msg);
|
||||||
if (R_FAILED(rc)) {
|
|
||||||
if ((rc & 0x3fffff) == 0x680) continue;
|
if (R_FAILED(rc))
|
||||||
|
{
|
||||||
|
if ((rc & 0x3fffff) == 0x680)
|
||||||
|
continue;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (msg==0 || msg!=0xF) continue;
|
if (msg != 0xF)
|
||||||
|
continue;
|
||||||
|
|
||||||
rc = _appletGetCurrentFocusState(&g_appletFocusState);
|
rc = _appletGetCurrentFocusState(&g_appletFocusState);
|
||||||
if (R_FAILED(rc)) break;
|
|
||||||
|
if (R_FAILED(rc))
|
||||||
|
break;
|
||||||
|
|
||||||
} while(g_appletFocusState!=1);
|
} while(g_appletFocusState!=1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (R_SUCCEEDED(rc)) rc = _appletAcquireForegroundRights();
|
if (R_SUCCEEDED(rc))
|
||||||
|
rc = _appletAcquireForegroundRights();
|
||||||
|
|
||||||
if (R_SUCCEEDED(rc)) rc = appletSetFocusHandlingMode(0);
|
if (R_SUCCEEDED(rc))
|
||||||
|
rc = appletSetFocusHandlingMode(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (R_SUCCEEDED(rc) && __nx_applet_auto_notifyrunning) appletNotifyRunning(NULL);
|
if (R_SUCCEEDED(rc) && __nx_applet_auto_notifyrunning)
|
||||||
|
appletNotifyRunning(NULL);
|
||||||
|
|
||||||
if (R_SUCCEEDED(rc)) rc = _appletGetOperationMode(&g_appletOperationMode);
|
if (R_SUCCEEDED(rc))
|
||||||
if (R_SUCCEEDED(rc)) rc = _appletGetPerformanceMode(&g_appletPerformanceMode);
|
rc = _appletGetOperationMode(&g_appletOperationMode);
|
||||||
|
if (R_SUCCEEDED(rc))
|
||||||
|
rc = _appletGetPerformanceMode(&g_appletPerformanceMode);
|
||||||
|
|
||||||
if (R_SUCCEEDED(rc) && __nx_applet_type!=APPLET_TYPE_Application) rc = _appletGetCurrentFocusState(&g_appletFocusState);
|
if (R_SUCCEEDED(rc) && __nx_applet_type!=AppletType_Application)
|
||||||
|
rc = _appletGetCurrentFocusState(&g_appletFocusState);
|
||||||
|
|
||||||
if (R_SUCCEEDED(rc)) rc = _appletSetOperationModeChangedNotification(1);
|
if (R_SUCCEEDED(rc))
|
||||||
if (R_SUCCEEDED(rc)) rc = _appletSetPerformanceModeChangedNotification(1);
|
rc = _appletSetOperationModeChangedNotification(1);
|
||||||
|
if (R_SUCCEEDED(rc))
|
||||||
|
rc = _appletSetPerformanceModeChangedNotification(1);
|
||||||
|
|
||||||
if (R_SUCCEEDED(rc)) rc = apmInitialize();
|
if (R_SUCCEEDED(rc))
|
||||||
|
rc = apmInitialize();
|
||||||
|
|
||||||
if (R_SUCCEEDED(rc)) {//Official apps aren't known to use apmSetPerformanceConfiguration with mode=1.
|
// Official apps aren't known to use apmSetPerformanceConfiguration with mode=1.
|
||||||
for (i=0; i<2; i++) {//This is broken with the regular "apm" service.
|
if (R_SUCCEEDED(rc)) {
|
||||||
if (__nx_applet_PerformanceConfiguration[i]) rc = apmSetPerformanceConfiguration(i, __nx_applet_PerformanceConfiguration[i]);
|
// This is broken with the regular "apm" service.
|
||||||
if (R_FAILED(rc)) break;
|
u32 i;
|
||||||
|
for (i=0; i<2; i++)
|
||||||
|
{
|
||||||
|
if (__nx_applet_PerformanceConfiguration[i])
|
||||||
|
rc = apmSetPerformanceConfiguration(i, __nx_applet_PerformanceConfiguration[i]);
|
||||||
|
|
||||||
|
if (R_FAILED(rc))
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (R_FAILED(rc)) appletExit();
|
if (R_FAILED(rc))
|
||||||
|
appletExit();
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
void appletExit(void)
|
void appletExit(void)
|
||||||
{
|
{
|
||||||
if (g_appletServiceSession == INVALID_HANDLE) return;
|
if (g_appletServiceSession == INVALID_HANDLE)
|
||||||
|
return;
|
||||||
|
|
||||||
apmExit();
|
apmExit();
|
||||||
|
|
||||||
@ -233,60 +277,62 @@ void appletExit(void)
|
|||||||
g_appletResourceUserId = 0;
|
g_appletResourceUserId = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void appletCallHook(applet_HookType hookType)
|
static void appletCallHook(AppletHookType hookType)
|
||||||
{
|
{
|
||||||
appletHookCookie* c;
|
AppletHookCookie* c;
|
||||||
for (c = &appletFirstHook; c && c->callback; c = c->next)
|
for (c = &g_appletFirstHook; c && c->callback; c = c->next)
|
||||||
c->callback(hookType, c->param);
|
c->callback(hookType, c->param);
|
||||||
}
|
}
|
||||||
|
|
||||||
void appletHook(appletHookCookie* cookie, appletHookFn callback, void* param)
|
void appletHook(AppletHookCookie* cookie, AppletHookFn callback, void* param)
|
||||||
{
|
{
|
||||||
if (!callback) return;
|
if (!callback)
|
||||||
|
return;
|
||||||
|
|
||||||
appletHookCookie* hook = &appletFirstHook;
|
AppletHookCookie* hook = &g_appletFirstHook;
|
||||||
*cookie = *hook; // Structure copy.
|
*cookie = *hook; // Structure copy.
|
||||||
hook->next = cookie;
|
hook->next = cookie;
|
||||||
hook->callback = callback;
|
hook->callback = callback;
|
||||||
hook->param = param;
|
hook->param = param;
|
||||||
}
|
}
|
||||||
|
|
||||||
void appletUnhook(appletHookCookie* cookie)
|
void appletUnhook(AppletHookCookie* cookie)
|
||||||
{
|
{
|
||||||
appletHookCookie* hook;
|
AppletHookCookie* hook;
|
||||||
for (hook = &appletFirstHook; hook; hook = hook->next)
|
for (hook = &g_appletFirstHook; hook; hook = hook->next)
|
||||||
{
|
{
|
||||||
if (hook->next == cookie)
|
if (hook->next == cookie)
|
||||||
{
|
{
|
||||||
*hook = *cookie; // Structure copy.
|
*hook = *cookie; // Structure copy.
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static Result appletSetFocusHandlingMode(u32 mode) {
|
static Result appletSetFocusHandlingMode(u32 mode) {
|
||||||
Result rc=0;
|
Result rc;
|
||||||
u8 invals[4];
|
u8 invals[4];
|
||||||
|
|
||||||
if (mode>3) return MAKERESULT(MODULE_LIBNX, LIBNX_BADINPUT);
|
if (mode > 3)
|
||||||
|
return MAKERESULT(MODULE_LIBNX, LIBNX_BADINPUT);
|
||||||
|
|
||||||
memset(invals, 0, sizeof(invals));
|
memset(invals, 0, sizeof(invals));
|
||||||
|
|
||||||
if (mode==0 || mode==3) {
|
if ((mode == 0) || (mode == 3)) {
|
||||||
invals[0] = 0;
|
invals[0] = 0;
|
||||||
invals[1] = 0;
|
invals[1] = 0;
|
||||||
invals[2] = 1;
|
invals[2] = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mode!=3) {
|
if (mode != 3) {
|
||||||
invals[3] = 0;
|
invals[3] = 0;
|
||||||
|
|
||||||
if (mode==1) {
|
if (mode == 1) {
|
||||||
invals[0] = 1;
|
invals[0] = 1;
|
||||||
invals[1] = 1;
|
invals[1] = 1;
|
||||||
invals[2] = 0;
|
invals[2] = 0;
|
||||||
}
|
}
|
||||||
else if (mode==2) {
|
else if (mode == 2) {
|
||||||
invals[0] = 1;
|
invals[0] = 1;
|
||||||
invals[1] = 0;
|
invals[1] = 0;
|
||||||
invals[2] = 1;
|
invals[2] = 1;
|
||||||
@ -458,7 +504,7 @@ void appletNotifyRunning(u8 *out) {
|
|||||||
IpcCommand c;
|
IpcCommand c;
|
||||||
ipcInitialize(&c);
|
ipcInitialize(&c);
|
||||||
|
|
||||||
if (__nx_applet_type!=APPLET_TYPE_Application || g_appletNotifiedRunning) return;
|
if (__nx_applet_type!=AppletType_Application || g_appletNotifiedRunning) return;
|
||||||
g_appletNotifiedRunning = 1;
|
g_appletNotifiedRunning = 1;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
@ -825,32 +871,44 @@ bool appletMainLoop(void) {
|
|||||||
u32 msg=0;
|
u32 msg=0;
|
||||||
s32 tmpindex=0;
|
s32 tmpindex=0;
|
||||||
|
|
||||||
if (R_FAILED(svcWaitSynchronization(&tmpindex, &g_appletMessageEventHandle, 1, 0))) return true;
|
if (R_FAILED(svcWaitSynchronization(&tmpindex, &g_appletMessageEventHandle, 1, 0)))
|
||||||
|
return true;
|
||||||
|
|
||||||
rc = _appletReceiveMessage(&msg);
|
rc = _appletReceiveMessage(&msg);
|
||||||
if (R_FAILED(rc)) {
|
|
||||||
if ((rc & 0x3fffff) == 0x680) return true;
|
if (R_FAILED(rc))
|
||||||
|
{
|
||||||
|
if ((rc & 0x3fffff) == 0x680)
|
||||||
|
return true;
|
||||||
|
|
||||||
fatalSimple(rc);
|
fatalSimple(rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(msg) {
|
switch(msg) {
|
||||||
case 0xF:
|
case 0xF:
|
||||||
rc = _appletGetCurrentFocusState(&g_appletFocusState);
|
rc = _appletGetCurrentFocusState(&g_appletFocusState);
|
||||||
if (R_SUCCEEDED(rc)) appletCallHook(APPLETHOOK_ONFOCUSSTATE);
|
|
||||||
|
if (R_SUCCEEDED(rc))
|
||||||
|
appletCallHook(AppletHookType_OnFocusState);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x1E:
|
case 0x1E:
|
||||||
rc = _appletGetOperationMode(&g_appletOperationMode);
|
rc = _appletGetOperationMode(&g_appletOperationMode);
|
||||||
if (R_SUCCEEDED(rc)) appletCallHook(APPLETHOOK_ONOPERATIONMODE);
|
|
||||||
|
if (R_SUCCEEDED(rc))
|
||||||
|
appletCallHook(AppletHookType_OnOperationMode);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x1F:
|
case 0x1F:
|
||||||
rc = _appletGetPerformanceMode(&g_appletPerformanceMode);
|
rc = _appletGetPerformanceMode(&g_appletPerformanceMode);
|
||||||
if (R_SUCCEEDED(rc)) appletCallHook(APPLETHOOK_ONPERFORMANCEMODE);
|
|
||||||
|
if (R_SUCCEEDED(rc))
|
||||||
|
appletCallHook(AppletHookType_OnPerformanceMode);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (R_FAILED(rc)) fatalSimple(rc);
|
if (R_FAILED(rc))
|
||||||
|
fatalSimple(rc);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user