misc: Small code improvements.

This commit is contained in:
Evan Husted 2024-10-14 15:03:09 -05:00
parent 5f6d9eef6b
commit b2a35ecf6c
6 changed files with 71 additions and 112 deletions

View file

@ -31,7 +31,7 @@
alt=""> alt="">
</a> </a>
<a href="https://discord.gg/dHPrkBkkyA"> <a href="https://discord.gg/dHPrkBkkyA">
<img src="https://img.shields.io/discord/410208534861447168?color=5865F2&label=Ryujinx&logo=discord&logoColor=white" <img src="https://img.shields.io/discord/1294443224030511104?color=5865F2&label=Ryujinx&logo=discord&logoColor=white"
alt="Discord"> alt="Discord">
</a> </a>
<br> <br>

View file

@ -492,7 +492,7 @@ namespace Ryujinx.Common.Collections
Start = start; Start = start;
End = end; End = end;
Max = end; Max = end;
Values = new List<RangeNode<TKey, TValue>> { new RangeNode<TKey, TValue>(start, end, value) }; Values = [ new RangeNode<TKey, TValue>(start, end, value) ];
Parent = parent; Parent = parent;
} }
} }

View file

@ -17,11 +17,8 @@ namespace Ryujinx.Headless.SDL2
public bool TextProcessingEnabled public bool TextProcessingEnabled
{ {
get get => Volatile.Read(ref _canProcessInput);
{
return Volatile.Read(ref _canProcessInput);
}
set set
{ {
Volatile.Write(ref _canProcessInput, value); Volatile.Write(ref _canProcessInput, value);

View file

@ -12,7 +12,10 @@ namespace Ryujinx.Input.SDL2
{ {
private bool HasConfiguration => _configuration != null; private bool HasConfiguration => _configuration != null;
private record struct ButtonMappingEntry(GamepadButtonInputId To, GamepadButtonInputId From); private readonly record struct ButtonMappingEntry(GamepadButtonInputId To, GamepadButtonInputId From)
{
public bool IsValid => To is not GamepadButtonInputId.Unbound && From is not GamepadButtonInputId.Unbound;
}
private StandardControllerInputConfig _configuration; private StandardControllerInputConfig _configuration;
@ -144,86 +147,64 @@ namespace Ryujinx.Input.SDL2
public void Rumble(float lowFrequency, float highFrequency, uint durationMs) public void Rumble(float lowFrequency, float highFrequency, uint durationMs)
{ {
if (Features.HasFlag(GamepadFeaturesFlag.Rumble)) if (!Features.HasFlag(GamepadFeaturesFlag.Rumble)) return;
{
ushort lowFrequencyRaw = (ushort)(lowFrequency * ushort.MaxValue);
ushort highFrequencyRaw = (ushort)(highFrequency * ushort.MaxValue);
if (durationMs == uint.MaxValue) ushort lowFrequencyRaw = (ushort)(lowFrequency * ushort.MaxValue);
{ ushort highFrequencyRaw = (ushort)(highFrequency * ushort.MaxValue);
if (SDL_GameControllerRumble(_gamepadHandle, lowFrequencyRaw, highFrequencyRaw, SDL_HAPTIC_INFINITY) != 0)
{ if (durationMs == uint.MaxValue)
Logger.Error?.Print(LogClass.Hid, "Rumble is not supported on this game controller."); {
} if (SDL_GameControllerRumble(_gamepadHandle, lowFrequencyRaw, highFrequencyRaw, SDL_HAPTIC_INFINITY) != 0)
} Logger.Error?.Print(LogClass.Hid, "Rumble is not supported on this game controller.");
else if (durationMs > SDL_HAPTIC_INFINITY) }
{ else if (durationMs > SDL_HAPTIC_INFINITY)
Logger.Error?.Print(LogClass.Hid, $"Unsupported rumble duration {durationMs}"); {
} Logger.Error?.Print(LogClass.Hid, $"Unsupported rumble duration {durationMs}");
else }
{ else
if (SDL_GameControllerRumble(_gamepadHandle, lowFrequencyRaw, highFrequencyRaw, durationMs) != 0) {
{ if (SDL_GameControllerRumble(_gamepadHandle, lowFrequencyRaw, highFrequencyRaw, durationMs) != 0)
Logger.Error?.Print(LogClass.Hid, "Rumble is not supported on this game controller."); Logger.Error?.Print(LogClass.Hid, "Rumble is not supported on this game controller.");
}
}
} }
} }
public Vector3 GetMotionData(MotionInputId inputId) public Vector3 GetMotionData(MotionInputId inputId)
{ {
SDL_SensorType sensorType = SDL_SensorType.SDL_SENSOR_INVALID; SDL_SensorType sensorType = inputId switch
if (inputId == MotionInputId.Accelerometer)
{ {
sensorType = SDL_SensorType.SDL_SENSOR_ACCEL; MotionInputId.Accelerometer => SDL_SensorType.SDL_SENSOR_ACCEL,
} MotionInputId.Gyroscope => SDL_SensorType.SDL_SENSOR_GYRO,
else if (inputId == MotionInputId.Gyroscope) _ => SDL_SensorType.SDL_SENSOR_INVALID
{ };
sensorType = SDL_SensorType.SDL_SENSOR_GYRO;
}
if (Features.HasFlag(GamepadFeaturesFlag.Motion) && sensorType != SDL_SensorType.SDL_SENSOR_INVALID) if (!Features.HasFlag(GamepadFeaturesFlag.Motion) || sensorType is SDL_SensorType.SDL_SENSOR_INVALID)
{ return Vector3.Zero;
const int ElementCount = 3;
unsafe const int ElementCount = 3;
unsafe
{
float* values = stackalloc float[ElementCount];
int result = SDL_GameControllerGetSensorData(_gamepadHandle, sensorType, (IntPtr)values, ElementCount);
if (result != 0)
return Vector3.Zero;
Vector3 value = new(values[0], values[1], values[2]);
return inputId switch
{ {
float* values = stackalloc float[ElementCount]; MotionInputId.Gyroscope => RadToDegree(value),
MotionInputId.Accelerometer => GsToMs2(value),
int result = SDL_GameControllerGetSensorData(_gamepadHandle, sensorType, (IntPtr)values, ElementCount); _ => value
};
if (result == 0)
{
Vector3 value = new(values[0], values[1], values[2]);
if (inputId == MotionInputId.Gyroscope)
{
return RadToDegree(value);
}
if (inputId == MotionInputId.Accelerometer)
{
return GsToMs2(value);
}
return value;
}
}
} }
return Vector3.Zero;
} }
private static Vector3 RadToDegree(Vector3 rad) private static Vector3 RadToDegree(Vector3 rad) => rad * (180 / MathF.PI);
{
return rad * (180 / MathF.PI);
}
private static Vector3 GsToMs2(Vector3 gs) private static Vector3 GsToMs2(Vector3 gs) => gs / SDL_STANDARD_GRAVITY;
{
return gs / SDL_STANDARD_GRAVITY;
}
public void SetConfiguration(InputConfig configuration) public void SetConfiguration(InputConfig configuration)
{ {
@ -278,16 +259,13 @@ namespace Ryujinx.Input.SDL2
lock (_userMappingLock) lock (_userMappingLock)
{ {
if (_buttonsUserMapping.Count == 0) if (_buttonsUserMapping.Count == 0)
{
return rawState; return rawState;
}
// ReSharper disable once ForeachCanBePartlyConvertedToQueryUsingAnotherGetEnumerator
foreach (ButtonMappingEntry entry in _buttonsUserMapping) foreach (ButtonMappingEntry entry in _buttonsUserMapping)
{ {
if (entry.From == GamepadButtonInputId.Unbound || entry.To == GamepadButtonInputId.Unbound) if (!entry.IsValid) continue;
{
continue;
}
// Do not touch state of button already pressed // Do not touch state of button already pressed
if (!result.IsPressed(entry.To)) if (!result.IsPressed(entry.To))
@ -316,9 +294,8 @@ namespace Ryujinx.Input.SDL2
public (float, float) GetStick(StickInputId inputId) public (float, float) GetStick(StickInputId inputId)
{ {
if (inputId == StickInputId.Unbound) if (inputId == StickInputId.Unbound)
{
return (0.0f, 0.0f); return (0.0f, 0.0f);
}
(short stickX, short stickY) = GetStickXY(inputId); (short stickX, short stickY) = GetStickXY(inputId);
@ -351,6 +328,7 @@ namespace Ryujinx.Input.SDL2
return (resultX, resultY); return (resultX, resultY);
} }
// ReSharper disable once InconsistentNaming
private (short, short) GetStickXY(StickInputId inputId) => private (short, short) GetStickXY(StickInputId inputId) =>
inputId switch inputId switch
{ {
@ -365,14 +343,12 @@ namespace Ryujinx.Input.SDL2
public bool IsPressed(GamepadButtonInputId inputId) public bool IsPressed(GamepadButtonInputId inputId)
{ {
if (inputId == GamepadButtonInputId.LeftTrigger) switch (inputId)
{ {
return ConvertRawStickValue(SDL_GameControllerGetAxis(_gamepadHandle, SDL_GameControllerAxis.SDL_CONTROLLER_AXIS_TRIGGERLEFT)) > _triggerThreshold; case GamepadButtonInputId.LeftTrigger:
} return ConvertRawStickValue(SDL_GameControllerGetAxis(_gamepadHandle, SDL_GameControllerAxis.SDL_CONTROLLER_AXIS_TRIGGERLEFT)) > _triggerThreshold;
case GamepadButtonInputId.RightTrigger:
if (inputId == GamepadButtonInputId.RightTrigger) return ConvertRawStickValue(SDL_GameControllerGetAxis(_gamepadHandle, SDL_GameControllerAxis.SDL_CONTROLLER_AXIS_TRIGGERRIGHT)) > _triggerThreshold;
{
return ConvertRawStickValue(SDL_GameControllerGetAxis(_gamepadHandle, SDL_GameControllerAxis.SDL_CONTROLLER_AXIS_TRIGGERRIGHT)) > _triggerThreshold;
} }
if (_buttonsDriverMapping[(int)inputId] == SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_INVALID) if (_buttonsDriverMapping[(int)inputId] == SDL_GameControllerButton.SDL_CONTROLLER_BUTTON_INVALID)

View file

@ -8,10 +8,8 @@ namespace Ryujinx.UI.Common.Helper
public static string ActiveApplicationTitle(ProcessResult activeProcess, string applicationVersion, string pauseString = "") public static string ActiveApplicationTitle(ProcessResult activeProcess, string applicationVersion, string pauseString = "")
{ {
if (activeProcess == null) if (activeProcess == null)
{ return string.Empty;
return String.Empty;
}
string titleNameSection = string.IsNullOrWhiteSpace(activeProcess.Name) ? string.Empty : $" {activeProcess.Name}"; string titleNameSection = string.IsNullOrWhiteSpace(activeProcess.Name) ? string.Empty : $" {activeProcess.Name}";
string titleVersionSection = string.IsNullOrWhiteSpace(activeProcess.DisplayVersion) ? string.Empty : $" v{activeProcess.DisplayVersion}"; string titleVersionSection = string.IsNullOrWhiteSpace(activeProcess.DisplayVersion) ? string.Empty : $" v{activeProcess.DisplayVersion}";
string titleIdSection = $" ({activeProcess.ProgramIdText.ToUpper()})"; string titleIdSection = $" ({activeProcess.ProgramIdText.ToUpper()})";
@ -19,12 +17,9 @@ namespace Ryujinx.UI.Common.Helper
string appTitle = $"Ryujinx {applicationVersion} -{titleNameSection}{titleVersionSection}{titleIdSection}{titleArchSection}"; string appTitle = $"Ryujinx {applicationVersion} -{titleNameSection}{titleVersionSection}{titleIdSection}{titleArchSection}";
if (!string.IsNullOrEmpty(pauseString)) return !string.IsNullOrEmpty(pauseString)
{ ? appTitle + $" ({pauseString})"
appTitle += $" ({pauseString})"; : appTitle;
}
return appTitle;
} }
} }
} }

View file

@ -1,6 +1,4 @@
using Avalonia;
using Avalonia.Controls; using Avalonia.Controls;
using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Interactivity; using Avalonia.Interactivity;
using Avalonia.Styling; using Avalonia.Styling;
using FluentAvalonia.UI.Controls; using FluentAvalonia.UI.Controls;
@ -64,21 +62,14 @@ namespace Ryujinx.Ava.UI.Windows
private void OpenLocation(object sender, RoutedEventArgs e) private void OpenLocation(object sender, RoutedEventArgs e)
{ {
if (sender is Button button) if (sender is Button { DataContext: TitleUpdateModel model })
{ OpenHelper.LocateFile(model.Path);
if (button.DataContext is TitleUpdateModel model)
{
OpenHelper.LocateFile(model.Path);
}
}
} }
private void RemoveUpdate(object sender, RoutedEventArgs e) private void RemoveUpdate(object sender, RoutedEventArgs e)
{ {
if (sender is Button button) if (sender is Button { DataContext: TitleUpdateModel model })
{ ViewModel.RemoveUpdate(model);
ViewModel.RemoveUpdate((TitleUpdateModel)button.DataContext);
}
} }
private void RemoveAll(object sender, RoutedEventArgs e) private void RemoveAll(object sender, RoutedEventArgs e)