input: Fixes TouchPoint wrong attribute (#2390)

This commit is contained in:
Ac_K 2021-06-23 23:44:09 +02:00 committed by GitHub
parent c71ae9c85c
commit d6b2ac33aa
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 71 additions and 32 deletions

View file

@ -31,6 +31,7 @@ namespace Ryujinx.HLE.HOS.Services.Hid
newState.Touches[i] = new TouchState newState.Touches[i] = new TouchState
{ {
DeltaTime = newState.SamplingNumber, DeltaTime = newState.SamplingNumber,
Attribute = pi.Attribute,
X = pi.X, X = pi.X,
Y = pi.Y, Y = pi.Y,
FingerId = (uint)i, FingerId = (uint)i,

View file

@ -1,7 +1,10 @@
using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.TouchScreen;
namespace Ryujinx.HLE.HOS.Services.Hid namespace Ryujinx.HLE.HOS.Services.Hid
{ {
public struct TouchPoint public struct TouchPoint
{ {
public TouchAttribute Attribute;
public uint X; public uint X;
public uint Y; public uint Y;
public uint DiameterX; public uint DiameterX;

View file

@ -3,7 +3,7 @@
namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.TouchScreen namespace Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.TouchScreen
{ {
[Flags] [Flags]
enum TouchAttribute : uint public enum TouchAttribute : uint
{ {
None = 0, None = 0,
Start = 1 << 0, Start = 1 << 0,

View file

@ -1,5 +1,6 @@
using Ryujinx.HLE; using Ryujinx.HLE;
using Ryujinx.HLE.HOS.Services.Hid; using Ryujinx.HLE.HOS.Services.Hid;
using Ryujinx.HLE.HOS.Services.Hid.Types.SharedMemory.TouchScreen;
using System; using System;
namespace Ryujinx.Input.HLE namespace Ryujinx.Input.HLE
@ -8,6 +9,7 @@ namespace Ryujinx.Input.HLE
{ {
private readonly IMouse _mouse; private readonly IMouse _mouse;
private Switch _device; private Switch _device;
private bool _wasClicking;
public TouchScreenManager(IMouse mouse) public TouchScreenManager(IMouse mouse)
{ {
@ -19,10 +21,35 @@ namespace Ryujinx.Input.HLE
_device = device; _device = device;
} }
public bool Update(bool isFocused, float aspectRatio = 0) public bool Update(bool isFocused, bool isClicking = false, float aspectRatio = 0)
{ {
if (!isFocused) if (!isFocused || (!_wasClicking && !isClicking))
{ {
// In case we lost focus, send the end touch.
if (_wasClicking && !isClicking)
{
MouseStateSnapshot snapshot = IMouse.GetMouseStateSnapshot(_mouse);
var touchPosition = IMouse.GetTouchPosition(snapshot.Position, _mouse.ClientSize, aspectRatio);
TouchPoint currentPoint = new TouchPoint
{
Attribute = TouchAttribute.End,
X = (uint)touchPosition.X,
Y = (uint)touchPosition.Y,
// Placeholder values till more data is acquired
DiameterX = 10,
DiameterY = 10,
Angle = 90
};
_device.Hid.Touchscreen.Update(currentPoint);
}
_wasClicking = false;
_device.Hid.Touchscreen.Update(); _device.Hid.Touchscreen.Update();
return false; return false;
@ -30,11 +57,24 @@ namespace Ryujinx.Input.HLE
if (aspectRatio > 0) if (aspectRatio > 0)
{ {
var snapshot = IMouse.GetMouseStateSnapshot(_mouse); MouseStateSnapshot snapshot = IMouse.GetMouseStateSnapshot(_mouse);
var touchPosition = IMouse.GetTouchPosition(snapshot.Position, _mouse.ClientSize, aspectRatio); var touchPosition = IMouse.GetTouchPosition(snapshot.Position, _mouse.ClientSize, aspectRatio);
TouchAttribute attribute = TouchAttribute.None;
if (!_wasClicking && isClicking)
{
attribute = TouchAttribute.Start;
}
else if (_wasClicking && !isClicking)
{
attribute = TouchAttribute.End;
}
TouchPoint currentPoint = new TouchPoint TouchPoint currentPoint = new TouchPoint
{ {
Attribute = attribute,
X = (uint)touchPosition.X, X = (uint)touchPosition.X,
Y = (uint)touchPosition.Y, Y = (uint)touchPosition.Y,
@ -46,6 +86,8 @@ namespace Ryujinx.Input.HLE
_device.Hid.Touchscreen.Update(currentPoint); _device.Hid.Touchscreen.Update(currentPoint);
_wasClicking = isClicking;
return true; return true;
} }

View file

@ -74,6 +74,8 @@ namespace Ryujinx.Ui
public RendererWidgetBase RendererWidget; public RendererWidgetBase RendererWidget;
public InputManager InputManager; public InputManager InputManager;
public bool IsFocused;
private static bool UseVulkan = false; private static bool UseVulkan = false;
#pragma warning disable CS0169, CS0649, IDE0044 #pragma warning disable CS0169, CS0649, IDE0044
@ -157,6 +159,8 @@ namespace Ryujinx.Ui
WindowStateEvent += WindowStateEvent_Changed; WindowStateEvent += WindowStateEvent_Changed;
DeleteEvent += Window_Close; DeleteEvent += Window_Close;
FocusInEvent += MainWindow_FocusInEvent;
FocusOutEvent += MainWindow_FocusOutEvent;
_applicationLibrary.ApplicationAdded += Application_Added; _applicationLibrary.ApplicationAdded += Application_Added;
_applicationLibrary.ApplicationCountUpdated += ApplicationCount_Updated; _applicationLibrary.ApplicationCountUpdated += ApplicationCount_Updated;
@ -272,6 +276,16 @@ namespace Ryujinx.Ui
_fullScreen.Label = args.Event.NewWindowState.HasFlag(Gdk.WindowState.Fullscreen) ? "Exit Fullscreen" : "Enter Fullscreen"; _fullScreen.Label = args.Event.NewWindowState.HasFlag(Gdk.WindowState.Fullscreen) ? "Exit Fullscreen" : "Enter Fullscreen";
} }
private void MainWindow_FocusOutEvent(object o, FocusOutEventArgs args)
{
IsFocused = false;
}
private void MainWindow_FocusInEvent(object o, FocusInEventArgs args)
{
IsFocused = true;
}
private void UpdateColumns() private void UpdateColumns()
{ {
foreach (TreeViewColumn column in _gameTable.Columns) foreach (TreeViewColumn column in _gameTable.Columns)

View file

@ -37,7 +37,6 @@ namespace Ryujinx.Ui
private bool _isActive; private bool _isActive;
private bool _isStopped; private bool _isStopped;
private bool _isFocused;
private bool _toggleFullscreen; private bool _toggleFullscreen;
private bool _toggleDockedMode; private bool _toggleDockedMode;
@ -91,8 +90,6 @@ namespace Ryujinx.Ui
| EventMask.KeyPressMask | EventMask.KeyPressMask
| EventMask.KeyReleaseMask)); | EventMask.KeyReleaseMask));
Shown += Renderer_Shown;
_exitEvent = new ManualResetEvent(false); _exitEvent = new ManualResetEvent(false);
_hideCursorOnIdle = ConfigurationState.Instance.HideCursorOnIdle; _hideCursorOnIdle = ConfigurationState.Instance.HideCursorOnIdle;
@ -124,16 +121,6 @@ namespace Ryujinx.Ui
}); });
} }
private void Parent_FocusOutEvent(object o, Gtk.FocusOutEventArgs args)
{
_isFocused = false;
}
private void Parent_FocusInEvent(object o, Gtk.FocusInEventArgs args)
{
_isFocused = true;
}
private void Renderer_Destroyed(object sender, EventArgs e) private void Renderer_Destroyed(object sender, EventArgs e)
{ {
ConfigurationState.Instance.HideCursorOnIdle.Event -= HideCursorStateChanged; ConfigurationState.Instance.HideCursorOnIdle.Event -= HideCursorStateChanged;
@ -142,11 +129,6 @@ namespace Ryujinx.Ui
Dispose(); Dispose();
} }
private void Renderer_Shown(object sender, EventArgs e)
{
_isFocused = ParentWindow.State.HasFlag(Gdk.WindowState.Focused);
}
protected override bool OnMotionNotifyEvent(EventMotion evnt) protected override bool OnMotionNotifyEvent(EventMotion evnt)
{ {
if (_hideCursorOnIdle) if (_hideCursorOnIdle)
@ -341,10 +323,7 @@ namespace Ryujinx.Ui
_isActive = true; _isActive = true;
Gtk.Window parent = this.Toplevel as Gtk.Window; Gtk.Window parent = Toplevel as Gtk.Window;
parent.FocusInEvent += Parent_FocusInEvent;
parent.FocusOutEvent += Parent_FocusOutEvent;
Application.Invoke(delegate Application.Invoke(delegate
{ {
@ -445,9 +424,9 @@ namespace Ryujinx.Ui
return false; return false;
} }
if (_isFocused) if ((Toplevel as MainWindow).IsFocused)
{ {
Gtk.Application.Invoke(delegate Application.Invoke(delegate
{ {
KeyboardStateSnapshot keyboard = _keyboardInterface.GetKeyboardStateSnapshot(); KeyboardStateSnapshot keyboard = _keyboardInterface.GetKeyboardStateSnapshot();
@ -465,7 +444,7 @@ namespace Ryujinx.Ui
NpadManager.Update(); NpadManager.Update();
if (_isFocused) if ((Toplevel as MainWindow).IsFocused)
{ {
KeyboardHotkeyState currentHotkeyState = GetHotkeyState(); KeyboardHotkeyState currentHotkeyState = GetHotkeyState();
@ -481,10 +460,10 @@ namespace Ryujinx.Ui
// Touchscreen // Touchscreen
bool hasTouch = false; bool hasTouch = false;
// Get screen touch position from left mouse click // Get screen touch position
if (_isFocused && (_inputManager.MouseDriver as GTK3MouseDriver).IsButtonPressed(MouseButton.Button1)) if ((Toplevel as MainWindow).IsFocused)
{ {
hasTouch = TouchScreenManager.Update(true, ConfigurationState.Instance.Graphics.AspectRatio.Value.ToFloat()); hasTouch = TouchScreenManager.Update(true, (_inputManager.MouseDriver as GTK3MouseDriver).IsButtonPressed(MouseButton.Button1), ConfigurationState.Instance.Graphics.AspectRatio.Value.ToFloat());
} }
if (!hasTouch) if (!hasTouch)