diff --git a/src/Avalonia.Base/Input/PointerOverPreProcessor.cs b/src/Avalonia.Base/Input/PointerOverPreProcessor.cs index 7781255d89..7c1fdc7233 100644 --- a/src/Avalonia.Base/Input/PointerOverPreProcessor.cs +++ b/src/Avalonia.Base/Input/PointerOverPreProcessor.cs @@ -6,7 +6,8 @@ namespace Avalonia.Input internal class PointerOverPreProcessor : IObserver { 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,