Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 89d41d1

Browse files
authored
Add unique device id for trackpad on web (#39260)
* Unique device id for trackpad on web * ++
1 parent 99a81a8 commit 89d41d1

File tree

2 files changed

+35
-9
lines changed

2 files changed

+35
-9
lines changed

lib/web_ui/lib/src/engine/pointer_binding.dart

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,9 @@ typedef _PointerDataCallback = void Function(Iterable<ui.PointerData>);
3333
// here, we use an already very large number (30 bits).
3434
const int _kButtonsMask = 0x3FFFFFFF;
3535

36-
// Intentionally set to -1 so it doesn't conflict with other device IDs.
36+
// Intentionally set to -1 or -2 so it doesn't conflict with other device IDs.
3737
const int _mouseDeviceId = -1;
38+
const int _trackpadDeviceId = -2;
3839

3940
const int _kPrimaryMouseButton = 0x1;
4041
const int _kSecondaryMouseButton = 0x2;
@@ -421,8 +422,10 @@ mixin _WheelEventListenerMixin on _BaseAdapter {
421422
const int domDeltaPage = 0x02;
422423

423424
ui.PointerDeviceKind kind = ui.PointerDeviceKind.mouse;
425+
int deviceId = _mouseDeviceId;
424426
if (_isTrackpadEvent(event)) {
425427
kind = ui.PointerDeviceKind.trackpad;
428+
deviceId = _trackpadDeviceId;
426429
}
427430

428431
// Flutter only supports pixel scroll delta. Convert deltaMode values
@@ -459,7 +462,7 @@ mixin _WheelEventListenerMixin on _BaseAdapter {
459462
timeStamp: _BaseAdapter._eventTimeStampToDuration(event.timeStamp!),
460463
kind: kind,
461464
signalKind: ui.PointerSignalKind.scroll,
462-
device: _mouseDeviceId,
465+
device: deviceId,
463466
physicalX: offset.dx * ui.window.devicePixelRatio,
464467
physicalY: offset.dy * ui.window.devicePixelRatio,
465468
buttons: event.buttons!.toInt(),

lib/web_ui/test/engine/pointer_binding_test.dart

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1265,6 +1265,7 @@ void testMain() {
12651265
packets[0].data[1].signalKind, equals(ui.PointerSignalKind.scroll));
12661266
expect(
12671267
packets[0].data[1].kind, equals(ui.PointerDeviceKind.trackpad));
1268+
expect(packets[0].data[1].device, equals(-2));
12681269
expect(packets[0].data[1].pointerIdentifier, equals(0));
12691270
expect(packets[0].data[1].synthesized, isFalse);
12701271
expect(packets[0].data[1].physicalX, equals(10.0 * dpi));
@@ -1281,6 +1282,7 @@ void testMain() {
12811282
packets[1].data[0].signalKind, equals(ui.PointerSignalKind.scroll));
12821283
expect(
12831284
packets[1].data[0].kind, equals(ui.PointerDeviceKind.trackpad));
1285+
expect(packets[1].data[0].device, equals(-2));
12841286
expect(packets[1].data[0].pointerIdentifier, equals(0));
12851287
expect(packets[1].data[0].synthesized, isFalse);
12861288
expect(packets[1].data[0].physicalX, equals(10.0 * dpi));
@@ -1297,6 +1299,7 @@ void testMain() {
12971299
packets[2].data[0].signalKind, equals(ui.PointerSignalKind.scroll));
12981300
expect(
12991301
packets[2].data[0].kind, equals(ui.PointerDeviceKind.trackpad));
1302+
expect(packets[2].data[0].device, equals(-2));
13001303
expect(packets[2].data[0].pointerIdentifier, equals(0));
13011304
expect(packets[2].data[0].synthesized, isFalse);
13021305
expect(packets[2].data[0].physicalX, equals(10.0 * dpi));
@@ -1313,6 +1316,7 @@ void testMain() {
13131316
packets[3].data[0].signalKind, equals(ui.PointerSignalKind.scroll));
13141317
expect(
13151318
packets[3].data[0].kind, equals(ui.PointerDeviceKind.trackpad));
1319+
expect(packets[3].data[0].device, equals(-2));
13161320
expect(packets[3].data[0].pointerIdentifier, equals(0));
13171321
expect(packets[3].data[0].synthesized, isFalse);
13181322
expect(packets[3].data[0].physicalX, equals(10.0 * dpi));
@@ -1323,13 +1327,14 @@ void testMain() {
13231327
expect(packets[3].data[0].scrollDeltaY, equals(119.0));
13241328

13251329
// Because the delta is in increments of 120, and is not similar to the
1326-
// previous event, but occured soon after the previous event, it will be
1330+
// previous event, but occurred soon after the previous event, it will be
13271331
// a trackpad event.
13281332
expect(packets[4].data[0].change, equals(ui.PointerChange.hover));
13291333
expect(
13301334
packets[4].data[0].signalKind, equals(ui.PointerSignalKind.scroll));
13311335
expect(
13321336
packets[4].data[0].kind, equals(ui.PointerDeviceKind.trackpad));
1337+
expect(packets[4].data[0].device, equals(-2));
13331338
expect(packets[4].data[0].pointerIdentifier, equals(0));
13341339
expect(packets[4].data[0].synthesized, isFalse);
13351340
expect(packets[4].data[0].physicalX, equals(10.0 * dpi));
@@ -1339,22 +1344,39 @@ void testMain() {
13391344
expect(packets[4].data[0].scrollDeltaX, equals(-120.0));
13401345
expect(packets[4].data[0].scrollDeltaY, equals(-120.0));
13411346

1342-
// Because the delta is in increments of 120, and is not similar to
1343-
// the previous event, and occured long after the previous event, it will be a mouse event.
1344-
expect(packets[5].data, hasLength(1));
1345-
expect(packets[5].data[0].change, equals(ui.PointerChange.hover));
1347+
// An add will be synthesized.
1348+
expect(packets[5].data, hasLength(2));
1349+
expect(packets[5].data[0].change, equals(ui.PointerChange.add));
13461350
expect(
1347-
packets[5].data[0].signalKind, equals(ui.PointerSignalKind.scroll));
1351+
packets[5].data[0].signalKind, equals(ui.PointerSignalKind.none));
13481352
expect(
13491353
packets[5].data[0].kind, equals(ui.PointerDeviceKind.mouse));
1354+
expect(packets[5].data[0].device, equals(-1));
13501355
expect(packets[5].data[0].pointerIdentifier, equals(0));
1351-
expect(packets[5].data[0].synthesized, isFalse);
1356+
expect(packets[5].data[0].synthesized, isTrue);
13521357
expect(packets[5].data[0].physicalX, equals(10.0 * dpi));
13531358
expect(packets[5].data[0].physicalY, equals(10.0 * dpi));
13541359
expect(packets[5].data[0].physicalDeltaX, equals(0.0));
13551360
expect(packets[5].data[0].physicalDeltaY, equals(0.0));
13561361
expect(packets[5].data[0].scrollDeltaX, equals(0.0));
13571362
expect(packets[5].data[0].scrollDeltaY, equals(-120.0));
1363+
// Because the delta is in increments of 120, and is not similar to
1364+
// the previous event, and occurred long after the previous event, it will
1365+
// be a mouse event.
1366+
expect(packets[5].data[1].change, equals(ui.PointerChange.hover));
1367+
expect(
1368+
packets[5].data[1].signalKind, equals(ui.PointerSignalKind.scroll));
1369+
expect(
1370+
packets[5].data[1].kind, equals(ui.PointerDeviceKind.mouse));
1371+
expect(packets[5].data[1].device, equals(-1));
1372+
expect(packets[5].data[1].pointerIdentifier, equals(0));
1373+
expect(packets[5].data[1].synthesized, isFalse);
1374+
expect(packets[5].data[1].physicalX, equals(10.0 * dpi));
1375+
expect(packets[5].data[1].physicalY, equals(10.0 * dpi));
1376+
expect(packets[5].data[1].physicalDeltaX, equals(0.0));
1377+
expect(packets[5].data[1].physicalDeltaY, equals(0.0));
1378+
expect(packets[5].data[1].scrollDeltaX, equals(0.0));
1379+
expect(packets[5].data[1].scrollDeltaY, equals(-120.0));
13581380

13591381
// Because the delta is not in increments of 120 and has non-matching
13601382
// wheelDelta, it will be a mouse event.
@@ -1364,6 +1386,7 @@ void testMain() {
13641386
packets[6].data[0].signalKind, equals(ui.PointerSignalKind.scroll));
13651387
expect(
13661388
packets[6].data[0].kind, equals(ui.PointerDeviceKind.mouse));
1389+
expect(packets[6].data[0].device, equals(-1));
13671390
expect(packets[6].data[0].pointerIdentifier, equals(0));
13681391
expect(packets[6].data[0].synthesized, isFalse);
13691392
expect(packets[6].data[0].physicalX, equals(10.0 * dpi));

0 commit comments

Comments
 (0)