Merge branch 'Ryujinx:master' into master

This commit is contained in:
Premo 2024-04-30 09:57:17 -04:00 committed by GitHub
commit cf1d9945f1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 139 additions and 71 deletions

View file

@ -23,8 +23,8 @@ namespace Ryujinx.HLE.HOS.Services.Hid
newState.Buttons = (MouseButton)buttons; newState.Buttons = (MouseButton)buttons;
newState.X = mouseX; newState.X = mouseX;
newState.Y = mouseY; newState.Y = mouseY;
newState.DeltaX = mouseX - previousEntry.DeltaX; newState.DeltaX = mouseX - previousEntry.X;
newState.DeltaY = mouseY - previousEntry.DeltaY; newState.DeltaY = mouseY - previousEntry.Y;
newState.WheelDeltaX = scrollX; newState.WheelDeltaX = scrollX;
newState.WheelDeltaY = scrollY; newState.WheelDeltaY = scrollY;
newState.Attributes = connected ? MouseAttribute.IsConnected : MouseAttribute.None; newState.Attributes = connected ? MouseAttribute.IsConnected : MouseAttribute.None;

View file

@ -487,10 +487,10 @@ namespace Ryujinx.Input.HLE
return value; return value;
} }
public KeyboardInput? GetHLEKeyboardInput() public static KeyboardInput GetHLEKeyboardInput(IGamepadDriver KeyboardDriver)
{
if (_gamepad is IKeyboard keyboard)
{ {
var keyboard = KeyboardDriver.GetGamepad("0") as IKeyboard;
KeyboardStateSnapshot keyboardState = keyboard.GetKeyboardStateSnapshot(); KeyboardStateSnapshot keyboardState = keyboard.GetKeyboardStateSnapshot();
KeyboardInput hidKeyboard = new() KeyboardInput hidKeyboard = new()
@ -514,12 +514,9 @@ namespace Ryujinx.Input.HLE
} }
return hidKeyboard; return hidKeyboard;
}
return null;
} }
protected virtual void Dispose(bool disposing) protected virtual void Dispose(bool disposing)
{ {
if (disposing) if (disposing)

View file

@ -231,11 +231,6 @@ namespace Ryujinx.Input.HLE
var altMotionState = isJoyconPair ? controller.GetHLEMotionState(true) : default; var altMotionState = isJoyconPair ? controller.GetHLEMotionState(true) : default;
motionState = (controller.GetHLEMotionState(), altMotionState); motionState = (controller.GetHLEMotionState(), altMotionState);
if (_enableKeyboard)
{
hleKeyboardInput = controller.GetHLEKeyboardInput();
}
} }
else else
{ {
@ -257,6 +252,11 @@ namespace Ryujinx.Input.HLE
} }
} }
if (!_blockInputUpdates && _enableKeyboard)
{
hleKeyboardInput = NpadController.GetHLEKeyboardInput(_keyboardDriver);
}
_device.Hid.Npads.Update(hleInputStates); _device.Hid.Npads.Update(hleInputStates);
_device.Hid.Npads.UpdateSixAxis(hleMotionStates); _device.Hid.Npads.UpdateSixAxis(hleMotionStates);

View file

@ -94,6 +94,17 @@ namespace Ryujinx.Ava
private long _lastCursorMoveTime; private long _lastCursorMoveTime;
private bool _isCursorInRenderer = true; private bool _isCursorInRenderer = true;
private bool _ignoreCursorState = false;
private enum CursorStates
{
CursorIsHidden,
CursorIsVisible,
ForceChangeCursor
};
private CursorStates _cursorState = !ConfigurationState.Instance.Hid.EnableMouse.Value ?
CursorStates.CursorIsVisible : CursorStates.CursorIsHidden;
private bool _isStopped; private bool _isStopped;
private bool _isActive; private bool _isActive;
@ -201,23 +212,65 @@ namespace Ryujinx.Ava
private void TopLevel_PointerEnteredOrMoved(object sender, PointerEventArgs e) private void TopLevel_PointerEnteredOrMoved(object sender, PointerEventArgs e)
{ {
if (!_viewModel.IsActive)
{
_isCursorInRenderer = false;
_ignoreCursorState = false;
return;
}
if (sender is MainWindow window) if (sender is MainWindow window)
{
if (ConfigurationState.Instance.HideCursor.Value == HideCursorMode.OnIdle)
{ {
_lastCursorMoveTime = Stopwatch.GetTimestamp(); _lastCursorMoveTime = Stopwatch.GetTimestamp();
}
var point = e.GetCurrentPoint(window).Position; var point = e.GetCurrentPoint(window).Position;
var bounds = RendererHost.EmbeddedWindow.Bounds; var bounds = RendererHost.EmbeddedWindow.Bounds;
var windowYOffset = bounds.Y + window.MenuBarHeight;
var windowYLimit = (int)window.Bounds.Height - window.StatusBarHeight - 1;
if (!_viewModel.ShowMenuAndStatusBar)
{
windowYOffset -= window.MenuBarHeight;
windowYLimit += window.StatusBarHeight + 1;
}
_isCursorInRenderer = point.X >= bounds.X && _isCursorInRenderer = point.X >= bounds.X &&
point.X <= bounds.Width + bounds.X && Math.Ceiling(point.X) <= (int)window.Bounds.Width &&
point.Y >= bounds.Y && point.Y >= windowYOffset &&
point.Y <= bounds.Height + bounds.Y; point.Y <= windowYLimit &&
!_viewModel.IsSubMenuOpen;
_ignoreCursorState = false;
} }
} }
private void TopLevel_PointerExited(object sender, PointerEventArgs e) private void TopLevel_PointerExited(object sender, PointerEventArgs e)
{ {
_isCursorInRenderer = false; _isCursorInRenderer = false;
if (sender is MainWindow window)
{
var point = e.GetCurrentPoint(window).Position;
var bounds = RendererHost.EmbeddedWindow.Bounds;
var windowYOffset = bounds.Y + window.MenuBarHeight;
var windowYLimit = (int)window.Bounds.Height - window.StatusBarHeight - 1;
if (!_viewModel.ShowMenuAndStatusBar)
{
windowYOffset -= window.MenuBarHeight;
windowYLimit += window.StatusBarHeight + 1;
}
_ignoreCursorState = (point.X == bounds.X ||
Math.Ceiling(point.X) == (int)window.Bounds.Width) &&
point.Y >= windowYOffset &&
point.Y <= windowYLimit;
}
_cursorState = CursorStates.ForceChangeCursor;
} }
private void UpdateScalingFilterLevel(object sender, ReactiveEventArgs<int> e) private void UpdateScalingFilterLevel(object sender, ReactiveEventArgs<int> e)
@ -244,10 +297,15 @@ namespace Ryujinx.Ava
_viewModel.Cursor = Cursor.Default; _viewModel.Cursor = Cursor.Default;
if (OperatingSystem.IsWindows()) if (OperatingSystem.IsWindows())
{
if (_cursorState != CursorStates.CursorIsHidden && !_ignoreCursorState)
{ {
SetCursor(_defaultCursorWin); SetCursor(_defaultCursorWin);
} }
}
}); });
_cursorState = CursorStates.CursorIsVisible;
} }
private void HideCursor() private void HideCursor()
@ -261,6 +319,8 @@ namespace Ryujinx.Ava
SetCursor(_invisibleCursorWin); SetCursor(_invisibleCursorWin);
} }
}); });
_cursorState = CursorStates.CursorIsHidden;
} }
private void SetRendererWindowSize(Size size) private void SetRendererWindowSize(Size size)
@ -523,6 +583,8 @@ namespace Ryujinx.Ava
{ {
_lastCursorMoveTime = Stopwatch.GetTimestamp(); _lastCursorMoveTime = Stopwatch.GetTimestamp();
} }
_cursorState = CursorStates.ForceChangeCursor;
} }
public async Task<bool> LoadGuestApplication() public async Task<bool> LoadGuestApplication()
@ -1037,39 +1099,33 @@ namespace Ryujinx.Ava
if (_viewModel.IsActive) if (_viewModel.IsActive)
{ {
if (_isCursorInRenderer) bool isCursorVisible = true;
if (_isCursorInRenderer && !_viewModel.ShowLoadProgress)
{ {
if (ConfigurationState.Instance.Hid.EnableMouse) if (ConfigurationState.Instance.Hid.EnableMouse.Value)
{ {
HideCursor(); isCursorVisible = ConfigurationState.Instance.HideCursor.Value == HideCursorMode.Never;
} }
else else
{ {
switch (ConfigurationState.Instance.HideCursor.Value) isCursorVisible = ConfigurationState.Instance.HideCursor.Value == HideCursorMode.Never ||
(ConfigurationState.Instance.HideCursor.Value == HideCursorMode.OnIdle &&
Stopwatch.GetTimestamp() - _lastCursorMoveTime < CursorHideIdleTime * Stopwatch.Frequency);
}
}
if (_cursorState != (isCursorVisible ? CursorStates.CursorIsVisible : CursorStates.CursorIsHidden))
{
if (isCursorVisible)
{ {
case HideCursorMode.Never:
ShowCursor(); ShowCursor();
break;
case HideCursorMode.OnIdle:
if (Stopwatch.GetTimestamp() - _lastCursorMoveTime >= CursorHideIdleTime * Stopwatch.Frequency)
{
HideCursor();
} }
else else
{ {
ShowCursor();
}
break;
case HideCursorMode.Always:
HideCursor(); HideCursor();
break;
} }
} }
}
else
{
ShowCursor();
}
Dispatcher.UIThread.Post(() => Dispatcher.UIThread.Post(() =>
{ {
@ -1154,7 +1210,7 @@ namespace Ryujinx.Ava
// Touchscreen. // Touchscreen.
bool hasTouch = false; bool hasTouch = false;
if (_viewModel.IsActive && !ConfigurationState.Instance.Hid.EnableMouse) if (_viewModel.IsActive && !ConfigurationState.Instance.Hid.EnableMouse.Value)
{ {
hasTouch = TouchScreenManager.Update(true, (_inputManager.MouseDriver as AvaloniaMouseDriver).IsButtonPressed(MouseButton.Button1), ConfigurationState.Instance.Graphics.AspectRatio.Value.ToFloat()); hasTouch = TouchScreenManager.Update(true, (_inputManager.MouseDriver as AvaloniaMouseDriver).IsButtonPressed(MouseButton.Button1), ConfigurationState.Instance.Graphics.AspectRatio.Value.ToFloat());
} }

View file

@ -19,8 +19,8 @@ namespace Ryujinx.Ava.UI.Helpers
{ Key.ShiftRight, LocaleKeys.KeyShiftRight }, { Key.ShiftRight, LocaleKeys.KeyShiftRight },
{ Key.ControlLeft, LocaleKeys.KeyControlLeft }, { Key.ControlLeft, LocaleKeys.KeyControlLeft },
{ Key.ControlRight, LocaleKeys.KeyControlRight }, { Key.ControlRight, LocaleKeys.KeyControlRight },
{ Key.AltLeft, LocaleKeys.KeyControlLeft }, { Key.AltLeft, LocaleKeys.KeyAltLeft },
{ Key.AltRight, LocaleKeys.KeyControlRight }, { Key.AltRight, LocaleKeys.KeyAltRight },
{ Key.WinLeft, LocaleKeys.KeyWinLeft }, { Key.WinLeft, LocaleKeys.KeyWinLeft },
{ Key.WinRight, LocaleKeys.KeyWinRight }, { Key.WinRight, LocaleKeys.KeyWinRight },
{ Key.Up, LocaleKeys.KeyUp }, { Key.Up, LocaleKeys.KeyUp },

View file

@ -111,8 +111,5 @@ namespace Ryujinx.Ava.UI.Helpers
[LibraryImport("user32.dll", SetLastError = true)] [LibraryImport("user32.dll", SetLastError = true)]
public static partial IntPtr SetWindowLongPtrW(IntPtr hWnd, int nIndex, IntPtr value); public static partial IntPtr SetWindowLongPtrW(IntPtr hWnd, int nIndex, IntPtr value);
[LibraryImport("user32.dll", SetLastError = true)]
public static partial IntPtr SetWindowLongW(IntPtr hWnd, int nIndex, int value);
} }
} }

View file

@ -157,7 +157,7 @@ namespace Ryujinx.Ava.UI.Renderer
lpfnWndProc = Marshal.GetFunctionPointerForDelegate(_wndProcDelegate), lpfnWndProc = Marshal.GetFunctionPointerForDelegate(_wndProcDelegate),
style = ClassStyles.CsOwndc, style = ClassStyles.CsOwndc,
lpszClassName = Marshal.StringToHGlobalUni(_className), lpszClassName = Marshal.StringToHGlobalUni(_className),
hCursor = CreateArrowCursor(), hCursor = CreateArrowCursor()
}; };
RegisterClassEx(ref wndClassEx); RegisterClassEx(ref wndClassEx);

View file

@ -104,6 +104,7 @@ namespace Ryujinx.Ava.UI.ViewModels
private double _windowHeight; private double _windowHeight;
private bool _isActive; private bool _isActive;
private bool _isSubMenuOpen;
public ApplicationData ListSelectedApplication; public ApplicationData ListSelectedApplication;
public ApplicationData GridSelectedApplication; public ApplicationData GridSelectedApplication;
@ -317,6 +318,17 @@ namespace Ryujinx.Ava.UI.ViewModels
} }
} }
public bool IsSubMenuOpen
{
get => _isSubMenuOpen;
set
{
_isSubMenuOpen = value;
OnPropertyChanged();
}
}
public bool ShowAll public bool ShowAll
{ {
get => _showAll; get => _showAll;

View file

@ -1,4 +1,4 @@
<UserControl <UserControl
xmlns="https://github.com/avaloniaui" xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
@ -16,7 +16,8 @@
Name="Menu" Name="Menu"
Height="35" Height="35"
Margin="0" Margin="0"
HorizontalAlignment="Left"> HorizontalAlignment="Left"
IsOpen="{Binding IsSubMenuOpen, Mode=OneWayToSource}">
<Menu.ItemsPanel> <Menu.ItemsPanel>
<ItemsPanelTemplate> <ItemsPanelTemplate>
<DockPanel Margin="0" HorizontalAlignment="Stretch" /> <DockPanel Margin="0" HorizontalAlignment="Stretch" />

View file

@ -56,6 +56,9 @@ namespace Ryujinx.Ava.UI.Windows
public static bool ShowKeyErrorOnLoad { get; set; } public static bool ShowKeyErrorOnLoad { get; set; }
public ApplicationLibrary ApplicationLibrary { get; set; } public ApplicationLibrary ApplicationLibrary { get; set; }
public readonly double StatusBarHeight;
public readonly double MenuBarHeight;
public MainWindow() public MainWindow()
{ {
ViewModel = new MainWindowViewModel(); ViewModel = new MainWindowViewModel();
@ -74,7 +77,9 @@ namespace Ryujinx.Ava.UI.Windows
ViewModel.Title = $"Ryujinx {Program.Version}"; ViewModel.Title = $"Ryujinx {Program.Version}";
// NOTE: Height of MenuBar and StatusBar is not usable here, since it would still be 0 at this point. // NOTE: Height of MenuBar and StatusBar is not usable here, since it would still be 0 at this point.
double barHeight = MenuBar.MinHeight + StatusBarView.StatusBar.MinHeight; StatusBarHeight = StatusBarView.StatusBar.MinHeight;
MenuBarHeight = MenuBar.MinHeight;
double barHeight = MenuBarHeight + StatusBarHeight;
Height = ((Height - barHeight) / Program.WindowScaleFactor) + barHeight; Height = ((Height - barHeight) / Program.WindowScaleFactor) + barHeight;
Width /= Program.WindowScaleFactor; Width /= Program.WindowScaleFactor;