From e5f510f7d3d28633ab83d9a943a8bc5ed57a8102 Mon Sep 17 00:00:00 2001 From: Ferhat Date: Thu, 3 Dec 2020 09:04:36 -0800 Subject: [PATCH] [web] Fix event transform between mousedown/up due to mouse move event (#22813) --- lib/web_ui/lib/src/engine/pointer_binding.dart | 1 + lib/web_ui/lib/src/engine/pointer_converter.dart | 14 +++++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/lib/web_ui/lib/src/engine/pointer_binding.dart b/lib/web_ui/lib/src/engine/pointer_binding.dart index 7a28ad558..74f21a5b6 100644 --- a/lib/web_ui/lib/src/engine/pointer_binding.dart +++ b/lib/web_ui/lib/src/engine/pointer_binding.dart @@ -412,6 +412,7 @@ class _ButtonSanitizer { } _pressedButtons = newPressedButtons; + return _SanitizedDetails( change: _pressedButtons == 0 ? ui.PointerChange.hover diff --git a/lib/web_ui/lib/src/engine/pointer_converter.dart b/lib/web_ui/lib/src/engine/pointer_converter.dart index f7870823b..c76e1a8e5 100644 --- a/lib/web_ui/lib/src/engine/pointer_converter.dart +++ b/lib/web_ui/lib/src/engine/pointer_converter.dart @@ -48,6 +48,14 @@ class PointerDataConverter { // Map from browser pointer identifiers to PointerEvent pointer identifiers. final Map _pointers = {}; + /// This field is used to keep track of button state. + /// + /// To normalize pointer events, when we receive pointer down followed by + /// pointer up, we synthesize a move event. To make sure that button state + /// is correct for move regardless of button state at the time of up event + /// we store it on down,hover and move events. + int _activeButtons = 0; + /// Clears the existing pointer states. /// /// This method is invoked during hot reload to make sure we have a clean @@ -55,6 +63,7 @@ class PointerDataConverter { void clearPointerState() { _pointers.clear(); _PointerState._pointerCount = 0; + _activeButtons = 0; } _PointerState _ensureStateForPointer(int device, double x, double y) { @@ -328,6 +337,7 @@ class PointerDataConverter { scrollDeltaY: scrollDeltaY, ) ); + _activeButtons = buttons; break; case ui.PointerChange.down: final bool alreadyAdded = _pointers.containsKey(device); @@ -426,6 +436,7 @@ class PointerDataConverter { scrollDeltaY: scrollDeltaY, ) ); + _activeButtons = buttons; break; case ui.PointerChange.move: assert(_pointers.containsKey(device)); @@ -459,6 +470,7 @@ class PointerDataConverter { scrollDeltaY: scrollDeltaY, ) ); + _activeButtons = buttons; break; case ui.PointerChange.up: case ui.PointerChange.cancel: @@ -485,7 +497,7 @@ class PointerDataConverter { device: device, physicalX: physicalX, physicalY: physicalY, - buttons: buttons, + buttons: _activeButtons, obscured: obscured, pressure: pressure, pressureMin: pressureMin, -- GitLab