From 31d34a6915bbe38f734fa4b180ba10fcd81b627f Mon Sep 17 00:00:00 2001 From: yellows8 Date: Thu, 25 Jul 2019 21:39:59 -0400 Subject: [PATCH] Added AppletTvPowerStateMatchingMode and AppletSystemButtonType. Added appletSetLcdBacklightOffEnabled, appletGetDefaultDisplayResolution, appletGetDefaultDisplayResolutionChangeEvent, appletGetHdcpAuthenticationState, appletGetHdcpAuthenticationStateChangeEvent, appletSetTvPowerStateMatchingMode, and appletPerformSystemButtonPressingIfInFocus. Minor other changes. --- nx/include/switch/services/applet.h | 68 +++++++++++++++++++++- nx/source/services/applet.c | 90 ++++++++++++++++++++++++++++- 2 files changed, 154 insertions(+), 4 deletions(-) diff --git a/nx/include/switch/services/applet.h b/nx/include/switch/services/applet.h index 6947e2f2..517a8d73 100644 --- a/nx/include/switch/services/applet.h +++ b/nx/include/switch/services/applet.h @@ -130,6 +130,20 @@ typedef enum { AppletThemeColorType_Unknown3 = 3, } AppletThemeColorType; +/// Mode values for \ref appletSetTvPowerStateMatchingMode. +typedef enum { + AppletTvPowerStateMatchingMode_Unknown0 = 0, ///< Unknown. + AppletTvPowerStateMatchingMode_Unknown1 = 1, ///< Unknown. +} AppletTvPowerStateMatchingMode; + +/// Type values for \ref PerformSystemButtonPressingIfInFocus. +typedef enum { + AppletSystemButtonType_HomeButtonShortPressing = 1, ///< Short-pressing with the HOME-button. + AppletSystemButtonType_HomeButtonLongPressing = 2, ///< Long-pressing with the HOME-button. + AppletSystemButtonType_CaptureButtonShortPressing = 6, ///< Short-pressing with the Capture-button. + AppletSystemButtonType_CaptureButtonLongPressing = 7, ///< Long-pressing with the Capture-button. +} AppletSystemButtonType; + /// Permission values for \ref appletSetScreenShotPermission. typedef enum { AppletScreenShotPermission_Inherit = 0, ///< Inherit from parent applet. @@ -252,6 +266,51 @@ Result appletIsVrModeEnabled(bool *out); */ Result appletSetVrModeEnabled(bool flag); +/** + * @brief Sets whether the LCD screen backlight is turned off. + * @note Only available with [4.0.0+]. + * @param[in] flag Flag + */ +Result appletSetLcdBacklightOffEnabled(bool flag); + +/** + * @brief Gets the DefaultDisplayResolution. + * @note Only available with [3.0.0+]. + * @param[out] width Output width. + * @param[out] height Output height. + */ +Result appletGetDefaultDisplayResolution(s32 *width, s32 *height); + +/** + * @brief Gets an Event which is signaled when the output from \ref appletGetDefaultDisplayResolution changes. + * @note Only available with [3.0.0+]. + * @note The Event must be closed by the user once finished with it. + * @param[out] out_event Output Event with autoclear=true. + */ +Result appletGetDefaultDisplayResolutionChangeEvent(Event *out_event); + +/** + * @brief Gets the HdcpAuthenticationState. + * @note Only available with [4.0.0+]. + * @param[out] state Output state. + */ +Result appletGetHdcpAuthenticationState(s32 *state); + +/** + * @brief Gets an Event which is signaled when the output from \ref appletGetHdcpAuthenticationState changes. + * @note Only available with [4.0.0+]. + * @note The Event must be closed by the user once finished with it. + * @param[out] out_event Output Event with autoclear=true. + */ +Result appletGetHdcpAuthenticationStateChangeEvent(Event *out_event); + +/** + * @brief Sets the \ref AppletTvPowerStateMatchingMode. + * @note Only available with [5.0.0+]. + * @param[in] mode \ref AppletTvPowerStateMatchingMode + */ +Result appletSetTvPowerStateMatchingMode(AppletTvPowerStateMatchingMode mode); + /** * @brief Sets the \ref ApmCpuBoostMode. * @note Only available with [7.0.0+] (not fully usable system-side with 6.x). @@ -259,6 +318,13 @@ Result appletSetVrModeEnabled(bool flag); */ Result appletSetCpuBoostMode(ApmCpuBoostMode mode); +/** + * @brief Perform SystemButtonPressing with the specified \ref AppletSystemButtonType. + * @note Only available with [6.0.0+]. + * @param[in] type \ref AppletSystemButtonType + */ +Result appletPerformSystemButtonPressingIfInFocus(AppletSystemButtonType type); + /** * @brief Gets the current PerformanceConfiguration. * @note Only available with [7.0.0+]. @@ -827,7 +893,7 @@ Result appletQueryApplicationPlayStatisticsByUid(u128 userID, PdmApplicationPlay * @note Only available with AppletType_*Application on [8.0.0+]. * @note The Event must be closed by the user once finished with it. * @note Official sw waits on this Event from a seperate thread, triggering an abort when it's signaled. - * @param[out] event_out Output Event with autoclear=false. + * @param[out] out_event Output Event with autoclear=false. */ Result appletGetGpuErrorDetectedSystemEvent(Event *out_event); diff --git a/nx/source/services/applet.c b/nx/source/services/applet.c index 697fba51..0c1b07b9 100644 --- a/nx/source/services/applet.c +++ b/nx/source/services/applet.c @@ -75,7 +75,7 @@ static AppletThemeColorType g_appletThemeColorType = AppletThemeColorType_Defaul static ApmCpuBoostMode g_appletCpuBoostMode = ApmCpuBoostMode_Disabled; static Result _appletGetHandle(Service* srv, Handle* handle_out, u64 cmd_id); -static Result _appletGetEvent(Service* srv, Event* event_out, u64 cmd_id, bool autoclear); +static Result _appletGetEvent(Service* srv, Event* out_event, u64 cmd_id, bool autoclear); static Result _appletGetSession(Service* srv, Service* srv_out, u64 cmd_id); static Result _appletGetSessionProxy(Service* srv_out, u64 cmd_id, Handle prochandle, u8 *AppletAttribute); @@ -513,12 +513,12 @@ static Result _appletGetHandle(Service* srv, Handle* handle_out, u64 cmd_id) { return rc; } -static Result _appletGetEvent(Service* srv, Event* event_out, u64 cmd_id, bool autoclear) { +static Result _appletGetEvent(Service* srv, Event* out_event, u64 cmd_id, bool autoclear) { Handle tmp_handle=0; Result rc = 0; rc = _appletGetHandle(srv, &tmp_handle, cmd_id); - if (R_SUCCEEDED(rc)) eventLoadRemote(event_out, tmp_handle, autoclear); + if (R_SUCCEEDED(rc)) eventLoadRemote(out_event, tmp_handle, autoclear); return rc; } @@ -1198,6 +1198,83 @@ Result appletSetVrModeEnabled(bool flag) { return _appletCmdNoIO(&g_appletICommonStateGetter, flag ? 53 : 54); } +Result appletSetLcdBacklightOffEnabled(bool flag) { + if (hosversionBefore(4,0,0)) + return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); + + return _appletCmdInBool(&g_appletICommonStateGetter, flag, 52); +} + +Result appletGetDefaultDisplayResolution(s32 *width, s32 *height) { + if (hosversionBefore(3,0,0)) + return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); + + IpcCommand c; + ipcInitialize(&c); + + struct { + u64 magic; + u64 cmd_id; + } *raw; + + raw = serviceIpcPrepareHeader(&g_appletICommonStateGetter, &c, sizeof(*raw)); + + raw->magic = SFCI_MAGIC; + raw->cmd_id = 60; + + Result rc = serviceIpcDispatch(&g_appletICommonStateGetter); + + if (R_SUCCEEDED(rc)) { + IpcParsedCommand r; + struct { + u64 magic; + u64 result; + s32 width; + s32 height; + } *resp; + + serviceIpcParse(&g_appletICommonStateGetter, &r, sizeof(*resp)); + resp = r.Raw; + + rc = resp->result; + + if (R_SUCCEEDED(rc)) { + if (width) *width = resp->width; + if (width) *height = resp->height; + } + } + + return rc; +} + +Result appletGetDefaultDisplayResolutionChangeEvent(Event *out_event) { + if (hosversionBefore(3,0,0)) + return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); + + return _appletGetEvent(&g_appletICommonStateGetter, out_event, 61, true); +} + +Result appletGetHdcpAuthenticationState(s32 *state) { + if (hosversionBefore(4,0,0)) + return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); + + return _appletCmdNoInOut32(&g_appletICommonStateGetter, (u32*)state, 62); +} + +Result appletGetHdcpAuthenticationStateChangeEvent(Event *out_event) { + if (hosversionBefore(4,0,0)) + return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); + + return _appletGetEvent(&g_appletICommonStateGetter, out_event, 63, true); +} + +Result appletSetTvPowerStateMatchingMode(AppletTvPowerStateMatchingMode mode) { + if (hosversionBefore(5,0,0)) + return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); + + return _appletCmdInU32(&g_appletICommonStateGetter, mode, 64); +} + Result appletSetCpuBoostMode(ApmCpuBoostMode mode) { Result rc=0; if (hosversionBefore(7,0,0)) @@ -1208,6 +1285,13 @@ Result appletSetCpuBoostMode(ApmCpuBoostMode mode) { return rc; } +Result appletPerformSystemButtonPressingIfInFocus(AppletSystemButtonType type) { + if (hosversionBefore(6,0,0)) + return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer); + + return _appletCmdInU32(&g_appletICommonStateGetter, type, 80); +} + Result appletGetCurrentPerformanceConfiguration(u32 *PerformanceConfiguration) { if (hosversionBefore(7,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer);