mirror of
https://github.com/Ryujinx/Ryujinx.git
synced 2024-12-29 10:01:20 -08:00
594246ea47
* add settings windows and children views * Expose hotkeys configuration on the UI * Remove double spacing from locale JSON * simplify button assigner * add cemuhook buttons and title to locale * move common button assigner to own class * cancel button assigner when window is closed * remove unused setting * address review. fix controller profile not loading default when switching devices * fix updater file name * Input cleanup (#37) * addressed review * add device type to controller device checks * change accessibility modifier of public classes to internal * Update Ryujinx.Ava/Ui/ViewModels/ControllerSettingsViewModel.cs Co-authored-by: gdkchan <gab.dark.100@gmail.com> * Update de_DE.json * Update de_DE.json * Update tr_TR.json Translated newly added lines * Update it_IT.json * fix rebase * update avalonia * fix wrong key used for button text * Align settings window elements * Tabs to spaces * Update brazilian portuguese translation * Minor improvement on brazilian portuguese translation * fix turkish translation * remove unused text * change view related classes to public * unsubscribe from deferred event if dialog is closed * Load the default language before loading any other when switching languages * Make controller settings more compact * increase default width of settings window, reduce profile buttons width Co-authored-by: gdk <gab.dark.100@gmail.com> Co-authored-by: MutantAura <44103205+MutantAura@users.noreply.github.com> Co-authored-by: Niwu34 <67392333+Niwu34@users.noreply.github.com> Co-authored-by: aegiff <99728970+aegiff@users.noreply.github.com> Co-authored-by: Antonio Brugnolo <36473846+AntoSkate@users.noreply.github.com>
205 lines
8.0 KiB
C#
205 lines
8.0 KiB
C#
using Ryujinx.Common.Configuration.Hid;
|
|
using Ryujinx.Common.Configuration.Hid.Keyboard;
|
|
using Ryujinx.Input;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Numerics;
|
|
|
|
using ConfigKey = Ryujinx.Common.Configuration.Hid.Key;
|
|
using Key = Ryujinx.Input.Key;
|
|
|
|
namespace Ryujinx.Ava.Input
|
|
{
|
|
internal class AvaloniaKeyboard : IKeyboard
|
|
{
|
|
private readonly List<ButtonMappingEntry> _buttonsUserMapping;
|
|
private readonly AvaloniaKeyboardDriver _driver;
|
|
|
|
private readonly object _userMappingLock = new();
|
|
|
|
private StandardKeyboardInputConfig _configuration;
|
|
|
|
private bool HasConfiguration => _configuration != null;
|
|
|
|
public string Id { get; }
|
|
public string Name { get; }
|
|
|
|
public bool IsConnected => true;
|
|
|
|
public GamepadFeaturesFlag Features => GamepadFeaturesFlag.None;
|
|
|
|
public AvaloniaKeyboard(AvaloniaKeyboardDriver driver, string id, string name)
|
|
{
|
|
_driver = driver;
|
|
Id = id;
|
|
Name = name;
|
|
_buttonsUserMapping = new List<ButtonMappingEntry>();
|
|
}
|
|
|
|
public void Dispose() { }
|
|
|
|
public KeyboardStateSnapshot GetKeyboardStateSnapshot()
|
|
{
|
|
return IKeyboard.GetStateSnapshot(this);
|
|
}
|
|
|
|
public GamepadStateSnapshot GetMappedStateSnapshot()
|
|
{
|
|
KeyboardStateSnapshot rawState = GetKeyboardStateSnapshot();
|
|
GamepadStateSnapshot result = default;
|
|
|
|
lock (_userMappingLock)
|
|
{
|
|
if (!HasConfiguration)
|
|
{
|
|
return result;
|
|
}
|
|
|
|
foreach (ButtonMappingEntry entry in _buttonsUserMapping)
|
|
{
|
|
if (entry.From == Key.Unknown || entry.From == Key.Unbound || entry.To == GamepadButtonInputId.Unbound)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
// Do not touch state of the button already pressed
|
|
if (!result.IsPressed(entry.To))
|
|
{
|
|
result.SetPressed(entry.To, rawState.IsPressed(entry.From));
|
|
}
|
|
}
|
|
|
|
(short leftStickX, short leftStickY) = GetStickValues(ref rawState, _configuration.LeftJoyconStick);
|
|
(short rightStickX, short rightStickY) = GetStickValues(ref rawState, _configuration.RightJoyconStick);
|
|
|
|
result.SetStick(StickInputId.Left, ConvertRawStickValue(leftStickX), ConvertRawStickValue(leftStickY));
|
|
result.SetStick(StickInputId.Right, ConvertRawStickValue(rightStickX), ConvertRawStickValue(rightStickY));
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
public GamepadStateSnapshot GetStateSnapshot()
|
|
{
|
|
throw new NotSupportedException();
|
|
}
|
|
|
|
public (float, float) GetStick(StickInputId inputId)
|
|
{
|
|
throw new NotSupportedException();
|
|
}
|
|
|
|
public bool IsPressed(GamepadButtonInputId inputId)
|
|
{
|
|
throw new NotSupportedException();
|
|
}
|
|
|
|
public bool IsPressed(Key key)
|
|
{
|
|
try
|
|
{
|
|
return _driver.IsPressed(key);
|
|
}
|
|
catch
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public void SetConfiguration(InputConfig configuration)
|
|
{
|
|
lock (_userMappingLock)
|
|
{
|
|
_configuration = (StandardKeyboardInputConfig)configuration;
|
|
|
|
_buttonsUserMapping.Clear();
|
|
|
|
// Left joycon
|
|
_buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.LeftStick, (Key)_configuration.LeftJoyconStick.StickButton));
|
|
_buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.DpadUp, (Key)_configuration.LeftJoycon.DpadUp));
|
|
_buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.DpadDown, (Key)_configuration.LeftJoycon.DpadDown));
|
|
_buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.DpadLeft, (Key)_configuration.LeftJoycon.DpadLeft));
|
|
_buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.DpadRight, (Key)_configuration.LeftJoycon.DpadRight));
|
|
_buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.Minus, (Key)_configuration.LeftJoycon.ButtonMinus));
|
|
_buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.LeftShoulder, (Key)_configuration.LeftJoycon.ButtonL));
|
|
_buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.LeftTrigger, (Key)_configuration.LeftJoycon.ButtonZl));
|
|
_buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.SingleRightTrigger0, (Key)_configuration.LeftJoycon.ButtonSr));
|
|
_buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.SingleLeftTrigger0, (Key)_configuration.LeftJoycon.ButtonSl));
|
|
|
|
// Finally right joycon
|
|
_buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.RightStick, (Key)_configuration.RightJoyconStick.StickButton));
|
|
_buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.A, (Key)_configuration.RightJoycon.ButtonA));
|
|
_buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.B, (Key)_configuration.RightJoycon.ButtonB));
|
|
_buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.X, (Key)_configuration.RightJoycon.ButtonX));
|
|
_buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.Y, (Key)_configuration.RightJoycon.ButtonY));
|
|
_buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.Plus, (Key)_configuration.RightJoycon.ButtonPlus));
|
|
_buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.RightShoulder, (Key)_configuration.RightJoycon.ButtonR));
|
|
_buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.RightTrigger, (Key)_configuration.RightJoycon.ButtonZr));
|
|
_buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.SingleRightTrigger1, (Key)_configuration.RightJoycon.ButtonSr));
|
|
_buttonsUserMapping.Add(new ButtonMappingEntry(GamepadButtonInputId.SingleLeftTrigger1, (Key)_configuration.RightJoycon.ButtonSl));
|
|
}
|
|
}
|
|
|
|
public void SetTriggerThreshold(float triggerThreshold) { }
|
|
|
|
public void Rumble(float lowFrequency, float highFrequency, uint durationMs) { }
|
|
|
|
public Vector3 GetMotionData(MotionInputId inputId) => Vector3.Zero;
|
|
|
|
private static float ConvertRawStickValue(short value)
|
|
{
|
|
const float ConvertRate = 1.0f / (short.MaxValue + 0.5f);
|
|
|
|
return value * ConvertRate;
|
|
}
|
|
|
|
private static (short, short) GetStickValues(ref KeyboardStateSnapshot snapshot, JoyconConfigKeyboardStick<ConfigKey> stickConfig)
|
|
{
|
|
short stickX = 0;
|
|
short stickY = 0;
|
|
|
|
if (snapshot.IsPressed((Key)stickConfig.StickUp))
|
|
{
|
|
stickY += 1;
|
|
}
|
|
|
|
if (snapshot.IsPressed((Key)stickConfig.StickDown))
|
|
{
|
|
stickY -= 1;
|
|
}
|
|
|
|
if (snapshot.IsPressed((Key)stickConfig.StickRight))
|
|
{
|
|
stickX += 1;
|
|
}
|
|
|
|
if (snapshot.IsPressed((Key)stickConfig.StickLeft))
|
|
{
|
|
stickX -= 1;
|
|
}
|
|
|
|
Vector2 stick = new(stickX, stickY);
|
|
|
|
stick = Vector2.Normalize(stick);
|
|
|
|
return ((short)(stick.X * short.MaxValue), (short)(stick.Y * short.MaxValue));
|
|
}
|
|
|
|
public void Clear()
|
|
{
|
|
_driver?.ResetKeys();
|
|
}
|
|
|
|
private class ButtonMappingEntry
|
|
{
|
|
public readonly Key From;
|
|
public readonly GamepadButtonInputId To;
|
|
|
|
public ButtonMappingEntry(GamepadButtonInputId to, Key from)
|
|
{
|
|
To = to;
|
|
From = from;
|
|
}
|
|
}
|
|
}
|
|
} |