Browse Source

Try to fix last known position reset

pull/10492/head
Max Katz 4 years ago
parent
commit
584756043d
  1. 21
      src/Avalonia.Base/Input/PointerOverPreProcessor.cs

21
src/Avalonia.Base/Input/PointerOverPreProcessor.cs

@ -6,7 +6,8 @@ namespace Avalonia.Input
internal class PointerOverPreProcessor : IObserver<RawInputEventArgs>
{
private IPointerDevice? _lastActivePointerDevice;
private (IPointer pointer, PixelPoint position)? _lastPointer;
private (IPointer pointer, PixelPoint position)? _currentPointer;
private PixelPoint? _lastKnownPosition;
private readonly IInputRoot _inputRoot;
@ -15,7 +16,7 @@ namespace Avalonia.Input
_inputRoot = inputRoot ?? throw new ArgumentNullException(nameof(inputRoot));
}
public PixelPoint? LastPosition => _lastPointer?.position;
public PixelPoint? LastPosition => _lastKnownPosition;
public void OnCompleted()
{
@ -41,9 +42,9 @@ namespace Avalonia.Input
}
if (args.Type is RawPointerEventType.LeaveWindow or RawPointerEventType.NonClientLeftButtonDown
&& _lastPointer is (var lastPointer, var lastPosition))
&& _currentPointer is (var lastPointer, var lastPosition))
{
_lastPointer = null;
_currentPointer = null;
ClearPointerOver(lastPointer, args.Root, 0, PointToClient(args.Root, lastPosition),
new PointerPointProperties(args.InputModifiers, args.Type.ToUpdateKind()),
args.InputModifiers.ToKeyModifiers());
@ -62,7 +63,7 @@ namespace Avalonia.Input
public void SceneInvalidated(Rect dirtyRect)
{
if (_lastPointer is (var pointer, var position))
if (_currentPointer is (var pointer, var position))
{
var clientPoint = PointToClient(_inputRoot, position);
@ -80,12 +81,12 @@ namespace Avalonia.Input
private void ClearPointerOver()
{
if (_lastPointer is (var pointer, var position))
if (_currentPointer is (var pointer, var position))
{
var clientPoint = PointToClient(_inputRoot, position);
ClearPointerOver(pointer, _inputRoot, 0, clientPoint, PointerPointProperties.None, KeyModifiers.None);
}
_lastPointer = null;
_currentPointer = null;
_lastActivePointerDevice = null;
}
@ -122,7 +123,7 @@ namespace Avalonia.Input
root.PointerOverElement = null;
_lastActivePointerDevice = null;
_lastPointer = null;
_currentPointer = null;
}
private void ClearChildrenPointerOver(PointerEventArgs e, IInputElement element, bool clearRoot)
@ -164,7 +165,9 @@ namespace Avalonia.Input
}
}
_lastPointer = (pointer, ((Visual)root).PointToScreen(position));
var screenPosition = ((Visual)root).PointToScreen(position);
_lastKnownPosition = screenPosition;
_currentPointer = (pointer, screenPosition);
}
private void SetPointerOverToElement(IPointer pointer, IInputRoot root, IInputElement element,

Loading…
Cancel
Save