using Ryujinx.Common.Logging; using Ryujinx.HLE.HOS.Services.Hid.HidServer; using Ryujinx.HLE.HOS.Services.Hid.Types; namespace Ryujinx.HLE.HOS.Services.Hid { [Service("hid:sys")] class IHidSystemServer : IpcService { public IHidSystemServer(ServiceCtx context) { } [CommandHipc(303)] // ApplyNpadSystemCommonPolicy(u64) public ResultCode ApplyNpadSystemCommonPolicy(ServiceCtx context) { ulong commonPolicy = context.RequestData.ReadUInt64(); Logger.Stub?.PrintStub(LogClass.ServiceHid, new { commonPolicy }); return ResultCode.Success; } [CommandHipc(306)] // GetLastActiveNpad(u32) -> u8, u8 public ResultCode GetLastActiveNpad(ServiceCtx context) { // TODO: RequestData seems to have garbage data, reading an extra uint seems to fix the issue. context.RequestData.ReadUInt32(); ResultCode resultCode = GetAppletFooterUiTypeImpl(context, out AppletFooterUiType appletFooterUiType); context.ResponseData.Write((byte)appletFooterUiType); context.ResponseData.Write((byte)0); return resultCode; } [CommandHipc(307)] // GetNpadSystemExtStyle() -> u64 public ResultCode GetNpadSystemExtStyle(ServiceCtx context) { foreach (PlayerIndex playerIndex in context.Device.Hid.Npads.GetSupportedPlayers()) { if (HidUtils.GetNpadIdTypeFromIndex(playerIndex) > NpadIdType.Handheld) { return ResultCode.InvalidNpadIdType; } } context.ResponseData.Write((ulong)context.Device.Hid.Npads.SupportedStyleSets); return ResultCode.Success; } [CommandHipc(314)] // 9.0.0+ // GetAppletFooterUiType(u32) -> u8 public ResultCode GetAppletFooterUiType(ServiceCtx context) { ResultCode resultCode = GetAppletFooterUiTypeImpl(context, out AppletFooterUiType appletFooterUiType); context.ResponseData.Write((byte)appletFooterUiType); return resultCode; } private ResultCode GetAppletFooterUiTypeImpl(ServiceCtx context, out AppletFooterUiType appletFooterUiType) { NpadIdType npadIdType = (NpadIdType)context.RequestData.ReadUInt32(); PlayerIndex playerIndex = HidUtils.GetIndexFromNpadIdType(npadIdType); appletFooterUiType = context.Device.Hid.SharedMemory.Npads[(int)playerIndex].InternalState.AppletFooterUiType; return ResultCode.Success; } } }