Browse Source

Add RawPointerId to the RawPointerEventArgs

Stylus
Max Katz 5 years ago
parent
commit
b599f295f6
  1. 5
      src/Avalonia.Input/Raw/RawPointerEventArgs.cs
  2. 17
      src/Avalonia.Input/Raw/RawTouchEventArgs.cs
  3. 13
      src/Avalonia.Input/TouchDevice.cs
  4. 12
      src/Shared/RawEventGrouping.cs
  5. 24
      tests/Avalonia.Input.UnitTests/TouchDeviceTests.cs

5
src/Avalonia.Input/Raw/RawPointerEventArgs.cs

@ -87,6 +87,11 @@ namespace Avalonia.Input.Raw
InputModifiers = inputModifiers; InputModifiers = inputModifiers;
} }
/// <summary>
/// Gets the raw pointer identifier.
/// </summary>
public long RawPointerId { get; set; }
/// <summary> /// <summary>
/// Gets the pointer properties and position, in client DIPs. /// Gets the pointer properties and position, in client DIPs.
/// </summary> /// </summary>

17
src/Avalonia.Input/Raw/RawTouchEventArgs.cs

@ -1,15 +1,26 @@
using System;
namespace Avalonia.Input.Raw namespace Avalonia.Input.Raw
{ {
public class RawTouchEventArgs : RawPointerEventArgs public class RawTouchEventArgs : RawPointerEventArgs
{ {
public RawTouchEventArgs(IInputDevice device, ulong timestamp, IInputRoot root, public RawTouchEventArgs(IInputDevice device, ulong timestamp, IInputRoot root,
RawPointerEventType type, Point position, RawInputModifiers inputModifiers, RawPointerEventType type, Point position, RawInputModifiers inputModifiers,
long touchPointId) long rawPointerId)
: base(device, timestamp, root, type, position, inputModifiers) : base(device, timestamp, root, type, position, inputModifiers)
{ {
TouchPointId = touchPointId; RawPointerId = rawPointerId;
}
public RawTouchEventArgs(IInputDevice device, ulong timestamp, IInputRoot root,
RawPointerEventType type, RawPointerPoint point, RawInputModifiers inputModifiers,
long rawPointerId)
: base(device, timestamp, root, type, point, inputModifiers)
{
RawPointerId = rawPointerId;
} }
public long TouchPointId { get; set; } [Obsolete("Use RawPointerId")]
public long TouchPointId { get => RawPointerId; set => RawPointerId = value; }
} }
} }

13
src/Avalonia.Input/TouchDevice.cs

@ -40,14 +40,14 @@ namespace Avalonia.Input
{ {
if (ev.Handled || _disposed) if (ev.Handled || _disposed)
return; return;
var args = (RawTouchEventArgs)ev; var args = (RawPointerEventArgs)ev;
if (!_pointers.TryGetValue(args.TouchPointId, out var pointer)) if (!_pointers.TryGetValue(args.RawPointerId, out var pointer))
{ {
if (args.Type == RawPointerEventType.TouchEnd) if (args.Type == RawPointerEventType.TouchEnd)
return; return;
var hit = args.InputHitTestResult; var hit = args.InputHitTestResult;
_pointers[args.TouchPointId] = pointer = new Pointer(Pointer.GetNextFreeId(), _pointers[args.RawPointerId] = pointer = new Pointer(Pointer.GetNextFreeId(),
PointerType.Touch, _pointers.Count == 0); PointerType.Touch, _pointers.Count == 0);
pointer.Capture(hit); pointer.Capture(hit);
} }
@ -88,7 +88,7 @@ namespace Avalonia.Input
if (args.Type == RawPointerEventType.TouchEnd) if (args.Type == RawPointerEventType.TouchEnd)
{ {
_pointers.Remove(args.TouchPointId); _pointers.Remove(args.RawPointerId);
using (pointer) using (pointer)
{ {
target.RaiseEvent(new PointerReleasedEventArgs(target, pointer, target.RaiseEvent(new PointerReleasedEventArgs(target, pointer,
@ -101,7 +101,7 @@ namespace Avalonia.Input
if (args.Type == RawPointerEventType.TouchCancel) if (args.Type == RawPointerEventType.TouchCancel)
{ {
_pointers.Remove(args.TouchPointId); _pointers.Remove(args.RawPointerId);
using (pointer) using (pointer)
pointer.Capture(null); pointer.Capture(null);
_lastPointer = null; _lastPointer = null;
@ -129,8 +129,7 @@ namespace Avalonia.Input
public IPointer? TryGetPointer(RawPointerEventArgs ev) public IPointer? TryGetPointer(RawPointerEventArgs ev)
{ {
return ev is RawTouchEventArgs args return _pointers.TryGetValue(ev.RawPointerId, out var pointer)
&& _pointers.TryGetValue(args.TouchPointId, out var pointer)
? pointer ? pointer
: null; : null;
} }

12
src/Shared/RawEventGrouping.cs

@ -2,10 +2,8 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using Avalonia.Collections.Pooled; using Avalonia.Collections.Pooled;
using Avalonia.Input;
using Avalonia.Input.Raw; using Avalonia.Input.Raw;
using Avalonia.Threading; using Avalonia.Threading;
using JetBrains.Annotations;
namespace Avalonia; namespace Avalonia;
@ -19,7 +17,7 @@ internal class RawEventGrouper : IDisposable
private readonly Action<RawInputEventArgs> _eventCallback; private readonly Action<RawInputEventArgs> _eventCallback;
private readonly Queue<RawInputEventArgs> _inputQueue = new(); private readonly Queue<RawInputEventArgs> _inputQueue = new();
private readonly Action _dispatchFromQueue; private readonly Action _dispatchFromQueue;
readonly Dictionary<long, RawTouchEventArgs> _lastTouchPoints = new(); readonly Dictionary<long, RawPointerEventArgs> _lastTouchPoints = new();
RawInputEventArgs? _lastEvent; RawInputEventArgs? _lastEvent;
public RawEventGrouper(Action<RawInputEventArgs> eventCallback) public RawEventGrouper(Action<RawInputEventArgs> eventCallback)
@ -49,7 +47,7 @@ internal class RawEventGrouper : IDisposable
_lastEvent = null; _lastEvent = null;
if (ev is RawTouchEventArgs { Type: RawPointerEventType.TouchUpdate } touchUpdate) if (ev is RawTouchEventArgs { Type: RawPointerEventType.TouchUpdate } touchUpdate)
_lastTouchPoints.Remove(touchUpdate.TouchPointId); _lastTouchPoints.Remove(touchUpdate.RawPointerId);
_eventCallback?.Invoke(ev); _eventCallback?.Invoke(ev);
@ -88,11 +86,11 @@ internal class RawEventGrouper : IDisposable
{ {
if (args is RawTouchEventArgs touchEvent) if (args is RawTouchEventArgs touchEvent)
{ {
if (_lastTouchPoints.TryGetValue(touchEvent.TouchPointId, out var lastTouchEvent)) if (_lastTouchPoints.TryGetValue(touchEvent.RawPointerId, out var lastTouchEvent))
MergeEvents(lastTouchEvent, touchEvent); MergeEvents(lastTouchEvent, touchEvent);
else else
{ {
_lastTouchPoints[touchEvent.TouchPointId] = touchEvent; _lastTouchPoints[touchEvent.RawPointerId] = touchEvent;
AddToQueue(touchEvent); AddToQueue(touchEvent);
} }
} }
@ -105,7 +103,7 @@ internal class RawEventGrouper : IDisposable
{ {
_lastTouchPoints.Clear(); _lastTouchPoints.Clear();
if (args is RawTouchEventArgs { Type: RawPointerEventType.TouchUpdate } touchEvent) if (args is RawTouchEventArgs { Type: RawPointerEventType.TouchUpdate } touchEvent)
_lastTouchPoints[touchEvent.TouchPointId] = touchEvent; _lastTouchPoints[touchEvent.RawPointerId] = touchEvent;
} }
AddToQueue(args); AddToQueue(args);
} }

24
tests/Avalonia.Input.UnitTests/TouchDeviceTests.cs

@ -219,30 +219,36 @@ namespace Avalonia.Input.UnitTests
{ {
for (int i = 0; i < touchPointIds.Length; i++) for (int i = 0; i < touchPointIds.Length; i++)
{ {
inputManager.ProcessInput(new RawTouchEventArgs(device, 0, inputManager.ProcessInput(new RawPointerEventArgs(device, 0,
root, root,
type, type,
new Point(0, 0), new Point(0, 0),
RawInputModifiers.None, RawInputModifiers.None)
touchPointIds[i])); {
RawPointerId = touchPointIds[i]
});
} }
} }
private static void TapOnce(IInputManager inputManager, TouchDevice device, IInputRoot root, ulong timestamp = 0, long touchPointId = 0) private static void TapOnce(IInputManager inputManager, TouchDevice device, IInputRoot root, ulong timestamp = 0, long touchPointId = 0)
{ {
inputManager.ProcessInput(new RawTouchEventArgs(device, timestamp, inputManager.ProcessInput(new RawPointerEventArgs(device, timestamp,
root, root,
RawPointerEventType.TouchBegin, RawPointerEventType.TouchBegin,
new Point(0, 0), new Point(0, 0),
RawInputModifiers.None, RawInputModifiers.None)
touchPointId)); {
inputManager.ProcessInput(new RawTouchEventArgs(device, timestamp, RawPointerId = touchPointId
});
inputManager.ProcessInput(new RawPointerEventArgs(device, timestamp,
root, root,
RawPointerEventType.TouchEnd, RawPointerEventType.TouchEnd,
new Point(0, 0), new Point(0, 0),
RawInputModifiers.None, RawInputModifiers.None)
touchPointId)); {
RawPointerId = touchPointId
});
} }
} }
} }

Loading…
Cancel
Save