diff --git a/lib/web_ui/lib/src/engine/pointer_binding.dart b/lib/web_ui/lib/src/engine/pointer_binding.dart index dc116ab9f3b90..21fc00c81729b 100644 --- a/lib/web_ui/lib/src/engine/pointer_binding.dart +++ b/lib/web_ui/lib/src/engine/pointer_binding.dart @@ -33,8 +33,9 @@ typedef _PointerDataCallback = void Function(Iterable); // here, we use an already very large number (30 bits). const int _kButtonsMask = 0x3FFFFFFF; -// Intentionally set to -1 so it doesn't conflict with other device IDs. +// Intentionally set to -1 or -2 so it doesn't conflict with other device IDs. const int _mouseDeviceId = -1; +const int _trackpadDeviceId = -2; const int _kPrimaryMouseButton = 0x1; const int _kSecondaryMouseButton = 0x2; @@ -421,8 +422,10 @@ mixin _WheelEventListenerMixin on _BaseAdapter { const int domDeltaPage = 0x02; ui.PointerDeviceKind kind = ui.PointerDeviceKind.mouse; + int deviceId = _mouseDeviceId; if (_isTrackpadEvent(event)) { kind = ui.PointerDeviceKind.trackpad; + deviceId = _trackpadDeviceId; } // Flutter only supports pixel scroll delta. Convert deltaMode values @@ -459,7 +462,7 @@ mixin _WheelEventListenerMixin on _BaseAdapter { timeStamp: _BaseAdapter._eventTimeStampToDuration(event.timeStamp!), kind: kind, signalKind: ui.PointerSignalKind.scroll, - device: _mouseDeviceId, + device: deviceId, physicalX: offset.dx * ui.window.devicePixelRatio, physicalY: offset.dy * ui.window.devicePixelRatio, buttons: event.buttons!.toInt(), diff --git a/lib/web_ui/test/engine/pointer_binding_test.dart b/lib/web_ui/test/engine/pointer_binding_test.dart index 6bba0cf5ce080..2dedf3ea5f491 100644 --- a/lib/web_ui/test/engine/pointer_binding_test.dart +++ b/lib/web_ui/test/engine/pointer_binding_test.dart @@ -1265,6 +1265,7 @@ void testMain() { packets[0].data[1].signalKind, equals(ui.PointerSignalKind.scroll)); expect( packets[0].data[1].kind, equals(ui.PointerDeviceKind.trackpad)); + expect(packets[0].data[1].device, equals(-2)); expect(packets[0].data[1].pointerIdentifier, equals(0)); expect(packets[0].data[1].synthesized, isFalse); expect(packets[0].data[1].physicalX, equals(10.0 * dpi)); @@ -1281,6 +1282,7 @@ void testMain() { packets[1].data[0].signalKind, equals(ui.PointerSignalKind.scroll)); expect( packets[1].data[0].kind, equals(ui.PointerDeviceKind.trackpad)); + expect(packets[1].data[0].device, equals(-2)); expect(packets[1].data[0].pointerIdentifier, equals(0)); expect(packets[1].data[0].synthesized, isFalse); expect(packets[1].data[0].physicalX, equals(10.0 * dpi)); @@ -1297,6 +1299,7 @@ void testMain() { packets[2].data[0].signalKind, equals(ui.PointerSignalKind.scroll)); expect( packets[2].data[0].kind, equals(ui.PointerDeviceKind.trackpad)); + expect(packets[2].data[0].device, equals(-2)); expect(packets[2].data[0].pointerIdentifier, equals(0)); expect(packets[2].data[0].synthesized, isFalse); expect(packets[2].data[0].physicalX, equals(10.0 * dpi)); @@ -1313,6 +1316,7 @@ void testMain() { packets[3].data[0].signalKind, equals(ui.PointerSignalKind.scroll)); expect( packets[3].data[0].kind, equals(ui.PointerDeviceKind.trackpad)); + expect(packets[3].data[0].device, equals(-2)); expect(packets[3].data[0].pointerIdentifier, equals(0)); expect(packets[3].data[0].synthesized, isFalse); expect(packets[3].data[0].physicalX, equals(10.0 * dpi)); @@ -1323,13 +1327,14 @@ void testMain() { expect(packets[3].data[0].scrollDeltaY, equals(119.0)); // Because the delta is in increments of 120, and is not similar to the - // previous event, but occured soon after the previous event, it will be + // previous event, but occurred soon after the previous event, it will be // a trackpad event. expect(packets[4].data[0].change, equals(ui.PointerChange.hover)); expect( packets[4].data[0].signalKind, equals(ui.PointerSignalKind.scroll)); expect( packets[4].data[0].kind, equals(ui.PointerDeviceKind.trackpad)); + expect(packets[4].data[0].device, equals(-2)); expect(packets[4].data[0].pointerIdentifier, equals(0)); expect(packets[4].data[0].synthesized, isFalse); expect(packets[4].data[0].physicalX, equals(10.0 * dpi)); @@ -1339,22 +1344,39 @@ void testMain() { expect(packets[4].data[0].scrollDeltaX, equals(-120.0)); expect(packets[4].data[0].scrollDeltaY, equals(-120.0)); - // Because the delta is in increments of 120, and is not similar to - // the previous event, and occured long after the previous event, it will be a mouse event. - expect(packets[5].data, hasLength(1)); - expect(packets[5].data[0].change, equals(ui.PointerChange.hover)); + // An add will be synthesized. + expect(packets[5].data, hasLength(2)); + expect(packets[5].data[0].change, equals(ui.PointerChange.add)); expect( - packets[5].data[0].signalKind, equals(ui.PointerSignalKind.scroll)); + packets[5].data[0].signalKind, equals(ui.PointerSignalKind.none)); expect( packets[5].data[0].kind, equals(ui.PointerDeviceKind.mouse)); + expect(packets[5].data[0].device, equals(-1)); expect(packets[5].data[0].pointerIdentifier, equals(0)); - expect(packets[5].data[0].synthesized, isFalse); + expect(packets[5].data[0].synthesized, isTrue); expect(packets[5].data[0].physicalX, equals(10.0 * dpi)); expect(packets[5].data[0].physicalY, equals(10.0 * dpi)); expect(packets[5].data[0].physicalDeltaX, equals(0.0)); expect(packets[5].data[0].physicalDeltaY, equals(0.0)); expect(packets[5].data[0].scrollDeltaX, equals(0.0)); expect(packets[5].data[0].scrollDeltaY, equals(-120.0)); + // Because the delta is in increments of 120, and is not similar to + // the previous event, and occurred long after the previous event, it will + // be a mouse event. + expect(packets[5].data[1].change, equals(ui.PointerChange.hover)); + expect( + packets[5].data[1].signalKind, equals(ui.PointerSignalKind.scroll)); + expect( + packets[5].data[1].kind, equals(ui.PointerDeviceKind.mouse)); + expect(packets[5].data[1].device, equals(-1)); + expect(packets[5].data[1].pointerIdentifier, equals(0)); + expect(packets[5].data[1].synthesized, isFalse); + expect(packets[5].data[1].physicalX, equals(10.0 * dpi)); + expect(packets[5].data[1].physicalY, equals(10.0 * dpi)); + expect(packets[5].data[1].physicalDeltaX, equals(0.0)); + expect(packets[5].data[1].physicalDeltaY, equals(0.0)); + expect(packets[5].data[1].scrollDeltaX, equals(0.0)); + expect(packets[5].data[1].scrollDeltaY, equals(-120.0)); // Because the delta is not in increments of 120 and has non-matching // wheelDelta, it will be a mouse event. @@ -1364,6 +1386,7 @@ void testMain() { packets[6].data[0].signalKind, equals(ui.PointerSignalKind.scroll)); expect( packets[6].data[0].kind, equals(ui.PointerDeviceKind.mouse)); + expect(packets[6].data[0].device, equals(-1)); expect(packets[6].data[0].pointerIdentifier, equals(0)); expect(packets[6].data[0].synthesized, isFalse); expect(packets[6].data[0].physicalX, equals(10.0 * dpi));