From ac5f9857e2f366cf3abae5f7cd76f6159502c7b8 Mon Sep 17 00:00:00 2001 From: sh0inx Date: Sat, 14 Mar 2026 13:25:55 -0500 Subject: [PATCH 1/5] HLE: Implement IHidServer IsSixAxisSensorAtRest (ryubing/ryujinx!228) See merge request ryubing/ryujinx!228 --- .../Services/Hid/HidDevices/NpadDevices.cs | 19 +++++++++++ .../HOS/Services/Hid/IHidServer.cs | 32 +++++++++++++------ 2 files changed, 42 insertions(+), 9 deletions(-) diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/NpadDevices.cs b/src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/NpadDevices.cs index b9235b033..990b2e288 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/NpadDevices.cs +++ b/src/Ryujinx.HLE/HOS/Services/Hid/HidDevices/NpadDevices.cs @@ -56,6 +56,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid _activeCount = 0; JoyHold = NpadJoyHoldType.Vertical; + SixAxisActive = false; } internal ref KEvent GetStyleSetUpdateEvent(PlayerIndex player) @@ -580,6 +581,24 @@ namespace Ryujinx.HLE.HOS.Services.Hid return needUpdateRight; } + + public bool isAtRest(int playerNumber) + { + + ref NpadInternalState currentNpad = ref _device.Hid.SharedMemory.Npads[playerNumber].InternalState; + ref SixAxisSensorState storage = ref GetSixAxisSensorLifo(ref currentNpad, false).GetCurrentEntryRef(); + + float acceleration = Math.Abs(storage.Acceleration.X) + + Math.Abs(storage.Acceleration.Y) + + Math.Abs(storage.Acceleration.Z); + + float angularVelocity = Math.Abs(storage.AngularVelocity.X) + + Math.Abs(storage.AngularVelocity.Y) + + Math.Abs(storage.AngularVelocity.Z); + + // TODO: check against config deadzone and add sensitivity setting + return ((acceleration <= 1.0F) && (angularVelocity <= 1.0F)); + } private void UpdateDisconnectedInputSixAxis(PlayerIndex index) { diff --git a/src/Ryujinx.HLE/HOS/Services/Hid/IHidServer.cs b/src/Ryujinx.HLE/HOS/Services/Hid/IHidServer.cs index 28db75663..08e2a2d68 100644 --- a/src/Ryujinx.HLE/HOS/Services/Hid/IHidServer.cs +++ b/src/Ryujinx.HLE/HOS/Services/Hid/IHidServer.cs @@ -602,19 +602,33 @@ namespace Ryujinx.HLE.HOS.Services.Hid } [CommandCmif(82)] - // IsSixAxisSensorAtRest(nn::hid::SixAxisSensorHandle, nn::applet::AppletResourceUserId) -> bool IsAsRest + // IsSixAxisSensorAtRest(nn::hid::SixAxisSensorHandle, nn::applet::AppletResourceUserId) -> bool IsAtRest public ResultCode IsSixAxisSensorAtRest(ServiceCtx context) { int sixAxisSensorHandle = context.RequestData.ReadInt32(); + + // 4 byte struct w/ 4-byte alignment + + // uint typeValue = (uint) sixAxisSensorHandle; // 0x0 0x4 TypeValue + // uint npadStyleIndex = (uint) sixAxisSensorHandle & 0xff; // 0x0 0x1 NpadStyleIndex + int playerNumber = (sixAxisSensorHandle << 8) & 0xff; // 0x1 0x1 PlayerNumber + // uint deviceIdx= ((uint) sixAxisSensorHandle << 16) & 0xff; // 0x2 0x1 DeviceIdx + // uint unknown = ((uint) sixAxisSensorHandle << 24) & 0xff; + + // 32bit sign extension padding -> if = 0, + offset, else - offset + + // npadStyleIndex = ((npadStyleIndex & 0x8000) == 0) ? npadStyleIndex | 0xFFFF0000 : npadStyleIndex & 0xFFFF0000; + // playerNumber = ((playerNumber & 0x8000) == 0) ? playerNumber | 0xFFFF0000 : playerNumber & 0xFFFF0000; + // deviceIdx = ((deviceIdx & 0x8000) == 0) ? deviceIdx | 0xFFFF0000 : deviceIdx & 0xFFFF0000; + // unknown = ((unknown & 0x8000) == 0) ? unknown | 0xFFFF0000 : unknown & 0xFFFF0000; + context.RequestData.BaseStream.Position += 4; // Padding long appletResourceUserId = context.RequestData.ReadInt64(); - - bool isAtRest = true; - - context.ResponseData.Write(isAtRest); - - Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, sixAxisSensorHandle, isAtRest }); - + + // TODO: link to context.Device.Hid.Npads.SixAxisActive when properly implemented + // We currently do not support stopping or starting SixAxisTracking. + + context.ResponseData.Write(context.Device.Hid.Npads.isAtRest(playerNumber)); return ResultCode.Success; } @@ -629,7 +643,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid context.ResponseData.Write(_isFirmwareUpdateAvailableForSixAxisSensor); Logger.Stub?.PrintStub(LogClass.ServiceHid, new { appletResourceUserId, sixAxisSensorHandle, _isFirmwareUpdateAvailableForSixAxisSensor }); - + return ResultCode.Success; } From 6f90e47a73436f9e052c32249d706b8c7fd44cb1 Mon Sep 17 00:00:00 2001 From: KeatonTheBot Date: Sat, 14 Mar 2026 13:48:59 -0500 Subject: [PATCH 2/5] UI: Restore FluentAvaloniaUI package, disable animations on app initialization (ryubing/ryujinx!256) See merge request ryubing/ryujinx!256 --- Directory.Packages.props | 16 ++++++++-------- src/Ryujinx/Ryujinx.csproj | 2 +- src/Ryujinx/UI/RyujinxApp.axaml.cs | 4 ++++ src/Ryujinx/UI/Views/Input/LedInputView.axaml | 13 ++++--------- src/Ryujinx/UI/Views/Input/LedInputView.axaml.cs | 9 ++++----- .../User/UserFirmwareAvatarSelectorView.axaml | 14 ++++---------- 6 files changed, 25 insertions(+), 33 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index fba3792db..9e3e9c97d 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -3,13 +3,13 @@ true - - - - - - - + + + + + + + @@ -22,7 +22,7 @@ - + diff --git a/src/Ryujinx/Ryujinx.csproj b/src/Ryujinx/Ryujinx.csproj index 715460274..489b2c313 100644 --- a/src/Ryujinx/Ryujinx.csproj +++ b/src/Ryujinx/Ryujinx.csproj @@ -49,7 +49,7 @@ - + diff --git a/src/Ryujinx/UI/RyujinxApp.axaml.cs b/src/Ryujinx/UI/RyujinxApp.axaml.cs index c778f27fb..22b98dea7 100644 --- a/src/Ryujinx/UI/RyujinxApp.axaml.cs +++ b/src/Ryujinx/UI/RyujinxApp.axaml.cs @@ -5,6 +5,7 @@ using Avalonia.Markup.Xaml; using Avalonia.Platform; using Avalonia.Styling; using Avalonia.Threading; +using FluentAvalonia.Core; using FluentAvalonia.UI.Windowing; using Gommon; using Ryujinx.Ava.Common.Locale; @@ -53,6 +54,9 @@ namespace Ryujinx.Ava { Name = FormatTitle(); + // Disable menu animations + FAUISettings.SetAnimationsEnabledAtAppLevel(false); + AvaloniaXamlLoader.Load(this); if (OperatingSystem.IsMacOS()) diff --git a/src/Ryujinx/UI/Views/Input/LedInputView.axaml b/src/Ryujinx/UI/Views/Input/LedInputView.axaml index c6319f424..327f27718 100644 --- a/src/Ryujinx/UI/Views/Input/LedInputView.axaml +++ b/src/Ryujinx/UI/Views/Input/LedInputView.axaml @@ -47,18 +47,13 @@ - - + diff --git a/src/Ryujinx/UI/Views/Input/LedInputView.axaml.cs b/src/Ryujinx/UI/Views/Input/LedInputView.axaml.cs index dab553f82..d0407beb3 100644 --- a/src/Ryujinx/UI/Views/Input/LedInputView.axaml.cs +++ b/src/Ryujinx/UI/Views/Input/LedInputView.axaml.cs @@ -1,4 +1,5 @@ using Avalonia; +using Avalonia.Controls; using FluentAvalonia.UI.Controls; using Ryujinx.Ava.Common.Locale; using Ryujinx.Ava.UI.Controls; @@ -30,19 +31,17 @@ namespace Ryujinx.UI.Views.Input InitializeComponent(); } - private void ColorPickerButton_OnColorChanged(ColorPickerButton sender, ColorButtonColorChangedEventArgs args) + private void ColorPicker_OnColorChanged(object sender, ColorChangedEventArgs args) { - if (!args.NewColor.HasValue) - return; if (!ViewModel.EnableLedChanging) return; if (ViewModel.TurnOffLed) return; - ViewModel.ParentModel.SelectedGamepad.SetLed(args.NewColor.Value.ToUInt32()); + ViewModel.ParentModel.SelectedGamepad.SetLed(args.NewColor.ToUInt32()); } - private void ColorPickerButton_OnAttachedToVisualTree(object sender, VisualTreeAttachmentEventArgs e) + private void ColorPicker_OnAttachedToVisualTree(object sender, VisualTreeAttachmentEventArgs e) { if (!ViewModel.EnableLedChanging) return; diff --git a/src/Ryujinx/UI/Views/User/UserFirmwareAvatarSelectorView.axaml b/src/Ryujinx/UI/Views/User/UserFirmwareAvatarSelectorView.axaml index c22624fd5..9028d5802 100644 --- a/src/Ryujinx/UI/Views/User/UserFirmwareAvatarSelectorView.axaml +++ b/src/Ryujinx/UI/Views/User/UserFirmwareAvatarSelectorView.axaml @@ -78,22 +78,16 @@ Spacing="10" Margin="0 24 0 0" HorizontalAlignment="Right"> - - + - - + +