TouchDevice.cs 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using Avalonia.Input.Raw;
  4. using Avalonia.VisualTree;
  5. namespace Avalonia.Input
  6. {
  7. /// <summary>
  8. /// Handles raw touch events
  9. /// <remarks>
  10. /// This class is supposed to be used on per-toplevel basis, don't use a shared one
  11. /// </remarks>
  12. /// </summary>
  13. public class TouchDevice : IInputDevice
  14. {
  15. Dictionary<long, Pointer> _pointers = new Dictionary<long, Pointer>();
  16. static InputModifiers GetModifiers(InputModifiers modifiers, bool left)
  17. {
  18. var mask = (InputModifiers)0x7fffffff ^ InputModifiers.LeftMouseButton ^ InputModifiers.MiddleMouseButton ^
  19. InputModifiers.RightMouseButton;
  20. modifiers &= mask;
  21. if (left)
  22. modifiers |= InputModifiers.LeftMouseButton;
  23. return modifiers;
  24. }
  25. public void ProcessRawEvent(RawInputEventArgs ev)
  26. {
  27. var args = (RawTouchEventArgs)ev;
  28. if (!_pointers.TryGetValue(args.TouchPointId, out var pointer))
  29. {
  30. if (args.Type == RawPointerEventType.TouchEnd)
  31. return;
  32. var hit = args.Root.InputHitTest(args.Position);
  33. _pointers[args.TouchPointId] = pointer = new Pointer(Pointer.GetNextFreeId(),
  34. PointerType.Touch, _pointers.Count == 0);
  35. pointer.Capture(hit);
  36. }
  37. var target = pointer.Captured ?? args.Root;
  38. if (args.Type == RawPointerEventType.TouchBegin)
  39. {
  40. target.RaiseEvent(new PointerPressedEventArgs(target, pointer,
  41. args.Root, args.Position, ev.Timestamp,
  42. new PointerPointProperties(GetModifiers(args.InputModifiers, pointer.IsPrimary)),
  43. GetModifiers(args.InputModifiers, false)));
  44. }
  45. if (args.Type == RawPointerEventType.TouchEnd)
  46. {
  47. _pointers.Remove(args.TouchPointId);
  48. using (pointer)
  49. {
  50. target.RaiseEvent(new PointerReleasedEventArgs(target, pointer,
  51. args.Root, args.Position, ev.Timestamp,
  52. new PointerPointProperties(GetModifiers(args.InputModifiers, false)),
  53. GetModifiers(args.InputModifiers, pointer.IsPrimary),
  54. pointer.IsPrimary ? MouseButton.Left : MouseButton.None));
  55. }
  56. }
  57. if (args.Type == RawPointerEventType.TouchCancel)
  58. {
  59. _pointers.Remove(args.TouchPointId);
  60. using (pointer)
  61. pointer.Capture(null);
  62. }
  63. if (args.Type == RawPointerEventType.TouchUpdate)
  64. {
  65. var modifiers = GetModifiers(args.InputModifiers, pointer.IsPrimary);
  66. target.RaiseEvent(new PointerEventArgs(InputElement.PointerMovedEvent, target, pointer, args.Root,
  67. args.Position, ev.Timestamp, new PointerPointProperties(modifiers), modifiers));
  68. }
  69. }
  70. }
  71. }