mirror of
https://git.ryujinx.app/ryubing/ryujinx.git
synced 2026-06-05 11:59:15 +00:00
Clear stuck keyboard input when windows lose focus
This commit is contained in:
@@ -24,6 +24,7 @@ namespace Ryujinx.Ava.Input
|
|||||||
|
|
||||||
private static readonly string[] _keyboardIdentifers = ["0"];
|
private static readonly string[] _keyboardIdentifers = ["0"];
|
||||||
private readonly Control _control;
|
private readonly Control _control;
|
||||||
|
private readonly Window _window;
|
||||||
private readonly HashSet<Key> _semanticPressedKeys;
|
private readonly HashSet<Key> _semanticPressedKeys;
|
||||||
private readonly HashSet<ConfigPhysicalKey> _physicalPressedKeys;
|
private readonly HashSet<ConfigPhysicalKey> _physicalPressedKeys;
|
||||||
private readonly Dictionary<Key, ConfigPhysicalKey> _observedPhysicalKeysBySemanticKey;
|
private readonly Dictionary<Key, ConfigPhysicalKey> _observedPhysicalKeysBySemanticKey;
|
||||||
@@ -42,6 +43,7 @@ namespace Ryujinx.Ava.Input
|
|||||||
public AvaloniaKeyboardDriver(Control control, KeyboardInputMode defaultMode = KeyboardInputMode.Semantic)
|
public AvaloniaKeyboardDriver(Control control, KeyboardInputMode defaultMode = KeyboardInputMode.Semantic)
|
||||||
{
|
{
|
||||||
_control = control;
|
_control = control;
|
||||||
|
_window = control as Window ?? TopLevel.GetTopLevel(control) as Window;
|
||||||
_semanticPressedKeys = [];
|
_semanticPressedKeys = [];
|
||||||
_physicalPressedKeys = [];
|
_physicalPressedKeys = [];
|
||||||
_observedPhysicalKeysBySemanticKey = [];
|
_observedPhysicalKeysBySemanticKey = [];
|
||||||
@@ -56,6 +58,12 @@ namespace Ryujinx.Ava.Input
|
|||||||
_control.AddHandler(InputElement.KeyDownEvent, OnKeyPress, RoutingStrategies.Tunnel, true);
|
_control.AddHandler(InputElement.KeyDownEvent, OnKeyPress, RoutingStrategies.Tunnel, true);
|
||||||
_control.AddHandler(InputElement.KeyUpEvent, OnKeyRelease, RoutingStrategies.Tunnel, true);
|
_control.AddHandler(InputElement.KeyUpEvent, OnKeyRelease, RoutingStrategies.Tunnel, true);
|
||||||
_control.TextInput += Control_TextInput;
|
_control.TextInput += Control_TextInput;
|
||||||
|
_window?.Deactivated += Window_Deactivated;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Window_Deactivated(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Control_TextInput(object sender, TextInputEventArgs e)
|
private void Control_TextInput(object sender, TextInputEventArgs e)
|
||||||
@@ -99,6 +107,10 @@ namespace Ryujinx.Ava.Input
|
|||||||
_control.RemoveHandler(InputElement.KeyDownEvent, OnKeyPress);
|
_control.RemoveHandler(InputElement.KeyDownEvent, OnKeyPress);
|
||||||
_control.RemoveHandler(InputElement.KeyUpEvent, OnKeyRelease);
|
_control.RemoveHandler(InputElement.KeyUpEvent, OnKeyRelease);
|
||||||
_control.TextInput -= Control_TextInput;
|
_control.TextInput -= Control_TextInput;
|
||||||
|
if (_window != null)
|
||||||
|
{
|
||||||
|
_window.Deactivated -= Window_Deactivated;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1234,9 +1234,17 @@ namespace Ryujinx.Ava.Systems
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool hasModalFocusLoss = _viewModel.Window is MainWindow mainWindow &&
|
||||||
|
mainWindow.SettingsWindow?.IsActive == true;
|
||||||
|
|
||||||
|
if (!_viewModel.IsActive || hasModalFocusLoss)
|
||||||
|
{
|
||||||
|
_inputManager.KeyboardDriver.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
NpadManager.Update(ConfigurationState.Instance.Graphics.AspectRatio.Value.ToFloat());
|
NpadManager.Update(ConfigurationState.Instance.Graphics.AspectRatio.Value.ToFloat());
|
||||||
|
|
||||||
if (_viewModel.IsActive)
|
if (_viewModel.IsActive && !hasModalFocusLoss)
|
||||||
{
|
{
|
||||||
bool isCursorVisible = true;
|
bool isCursorVisible = true;
|
||||||
|
|
||||||
@@ -1369,7 +1377,7 @@ namespace Ryujinx.Ava.Systems
|
|||||||
// Touchscreen.
|
// Touchscreen.
|
||||||
bool hasTouch = false;
|
bool hasTouch = false;
|
||||||
|
|
||||||
if (_viewModel.IsActive && !ConfigurationState.Instance.Hid.EnableMouse.Value)
|
if (_viewModel.IsActive && !hasModalFocusLoss && !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());
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user