|
|
|
@ -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, |
|
|
|
|