Skip to content

Commit f34a228

Browse files
authored
Add new pointer signal for cancelling scroll inertia (flutter#34402)
1 parent 3fe4125 commit f34a228

File tree

6 files changed

+120
-109
lines changed

6 files changed

+120
-109
lines changed

lib/ui/pointer.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,9 @@ enum PointerSignalKind {
129129
/// A pointer-generated scroll (e.g., mouse wheel or trackpad scroll).
130130
scroll,
131131

132+
/// A pointer-generated scroll-inertia cancel.
133+
scrollInertiaCancel,
134+
132135
/// An unknown pointer signal kind.
133136
unknown
134137
}

lib/ui/window/pointer_data.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ struct alignas(8) PointerData {
6060
enum class SignalKind : int64_t {
6161
kNone,
6262
kScroll,
63+
kScrollInertiaCancel,
6364
};
6465

6566
int64_t embedder_id;

lib/ui/window/pointer_data_packet_converter.cc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,8 @@ void PointerDataPacketConverter::ConvertPointerData(
297297
}
298298
} else {
299299
switch (pointer_data.signal_kind) {
300-
case PointerData::SignalKind::kScroll: {
300+
case PointerData::SignalKind::kScroll:
301+
case PointerData::SignalKind::kScrollInertiaCancel: {
301302
// Makes sure we have an existing pointer
302303
auto iter = states_.find(pointer_data.device);
303304
PointerState state;

lib/ui/window/pointer_data_packet_converter_unittests.cc

Lines changed: 111 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -554,114 +554,117 @@ TEST(PointerDataPacketConverterTest, CanHandleThreeFingerGesture) {
554554
// Third cancel should be dropped
555555
}
556556

557-
TEST(PointerDataPacketConverterTest, CanConvetScroll) {
558-
PointerDataPacketConverter converter;
559-
auto packet = std::make_unique<PointerDataPacket>(6);
560-
PointerData data;
561-
CreateSimulatedMousePointerData(data, PointerData::Change::kAdd,
562-
PointerData::SignalKind::kNone, 0, 0.0, 0.0,
563-
0.0, 0.0, 0);
564-
packet->SetPointerData(0, data);
565-
CreateSimulatedMousePointerData(data, PointerData::Change::kAdd,
566-
PointerData::SignalKind::kNone, 1, 0.0, 0.0,
567-
0.0, 0.0, 0);
568-
packet->SetPointerData(1, data);
569-
CreateSimulatedMousePointerData(data, PointerData::Change::kDown,
570-
PointerData::SignalKind::kNone, 1, 0.0, 0.0,
571-
0.0, 0.0, 1);
572-
packet->SetPointerData(2, data);
573-
CreateSimulatedMousePointerData(data, PointerData::Change::kHover,
574-
PointerData::SignalKind::kScroll, 0, 34.0,
575-
34.0, 30.0, 0.0, 0);
576-
packet->SetPointerData(3, data);
577-
CreateSimulatedMousePointerData(data, PointerData::Change::kHover,
578-
PointerData::SignalKind::kScroll, 1, 49.0,
579-
49.0, 50.0, 0.0, 0);
580-
packet->SetPointerData(4, data);
581-
CreateSimulatedMousePointerData(data, PointerData::Change::kHover,
582-
PointerData::SignalKind::kScroll, 2, 10.0,
583-
20.0, 30.0, 40.0, 0);
584-
packet->SetPointerData(5, data);
585-
auto converted_packet = converter.Convert(std::move(packet));
586-
587-
std::vector<PointerData> result;
588-
UnpackPointerPacket(result, std::move(converted_packet));
589-
590-
ASSERT_EQ(result.size(), (size_t)9);
591-
ASSERT_EQ(result[0].change, PointerData::Change::kAdd);
592-
ASSERT_EQ(result[0].signal_kind, PointerData::SignalKind::kNone);
593-
ASSERT_EQ(result[0].device, 0);
594-
ASSERT_EQ(result[0].physical_x, 0.0);
595-
ASSERT_EQ(result[0].physical_y, 0.0);
596-
ASSERT_EQ(result[0].synthesized, 0);
597-
598-
ASSERT_EQ(result[1].change, PointerData::Change::kAdd);
599-
ASSERT_EQ(result[1].signal_kind, PointerData::SignalKind::kNone);
600-
ASSERT_EQ(result[1].device, 1);
601-
ASSERT_EQ(result[1].physical_x, 0.0);
602-
ASSERT_EQ(result[1].physical_y, 0.0);
603-
ASSERT_EQ(result[1].synthesized, 0);
604-
605-
ASSERT_EQ(result[2].change, PointerData::Change::kDown);
606-
ASSERT_EQ(result[2].signal_kind, PointerData::SignalKind::kNone);
607-
ASSERT_EQ(result[2].device, 1);
608-
ASSERT_EQ(result[2].physical_x, 0.0);
609-
ASSERT_EQ(result[2].physical_y, 0.0);
610-
ASSERT_EQ(result[2].synthesized, 0);
611-
612-
// Converter will synthesize a hover to position for device 0.
613-
ASSERT_EQ(result[3].change, PointerData::Change::kHover);
614-
ASSERT_EQ(result[3].signal_kind, PointerData::SignalKind::kNone);
615-
ASSERT_EQ(result[3].device, 0);
616-
ASSERT_EQ(result[3].physical_x, 34.0);
617-
ASSERT_EQ(result[3].physical_y, 34.0);
618-
ASSERT_EQ(result[3].physical_delta_x, 34.0);
619-
ASSERT_EQ(result[3].physical_delta_y, 34.0);
620-
ASSERT_EQ(result[3].buttons, 0);
621-
ASSERT_EQ(result[3].synthesized, 1);
622-
623-
ASSERT_EQ(result[4].change, PointerData::Change::kHover);
624-
ASSERT_EQ(result[4].signal_kind, PointerData::SignalKind::kScroll);
625-
ASSERT_EQ(result[4].device, 0);
626-
ASSERT_EQ(result[4].physical_x, 34.0);
627-
ASSERT_EQ(result[4].physical_y, 34.0);
628-
ASSERT_EQ(result[4].scroll_delta_x, 30.0);
629-
ASSERT_EQ(result[4].scroll_delta_y, 0.0);
630-
631-
// Converter will synthesize a move to position for device 1.
632-
ASSERT_EQ(result[5].change, PointerData::Change::kMove);
633-
ASSERT_EQ(result[5].signal_kind, PointerData::SignalKind::kNone);
634-
ASSERT_EQ(result[5].device, 1);
635-
ASSERT_EQ(result[5].physical_x, 49.0);
636-
ASSERT_EQ(result[5].physical_y, 49.0);
637-
ASSERT_EQ(result[5].physical_delta_x, 49.0);
638-
ASSERT_EQ(result[5].physical_delta_y, 49.0);
639-
ASSERT_EQ(result[5].buttons, 1);
640-
ASSERT_EQ(result[5].synthesized, 1);
641-
642-
ASSERT_EQ(result[6].change, PointerData::Change::kHover);
643-
ASSERT_EQ(result[6].signal_kind, PointerData::SignalKind::kScroll);
644-
ASSERT_EQ(result[6].device, 1);
645-
ASSERT_EQ(result[6].physical_x, 49.0);
646-
ASSERT_EQ(result[6].physical_y, 49.0);
647-
ASSERT_EQ(result[6].scroll_delta_x, 50.0);
648-
ASSERT_EQ(result[6].scroll_delta_y, 0.0);
649-
650-
// Converter will synthesize an add for device 2.
651-
ASSERT_EQ(result[7].change, PointerData::Change::kAdd);
652-
ASSERT_EQ(result[7].signal_kind, PointerData::SignalKind::kNone);
653-
ASSERT_EQ(result[7].device, 2);
654-
ASSERT_EQ(result[7].physical_x, 10.0);
655-
ASSERT_EQ(result[7].physical_y, 20.0);
656-
ASSERT_EQ(result[7].synthesized, 1);
657-
658-
ASSERT_EQ(result[8].change, PointerData::Change::kHover);
659-
ASSERT_EQ(result[8].signal_kind, PointerData::SignalKind::kScroll);
660-
ASSERT_EQ(result[8].device, 2);
661-
ASSERT_EQ(result[8].physical_x, 10.0);
662-
ASSERT_EQ(result[8].physical_y, 20.0);
663-
ASSERT_EQ(result[8].scroll_delta_x, 30.0);
664-
ASSERT_EQ(result[8].scroll_delta_y, 40.0);
557+
TEST(PointerDataPacketConverterTest, CanConvertPointerSignals) {
558+
PointerData::SignalKind signal_kinds[] = {
559+
PointerData::SignalKind::kScroll,
560+
PointerData::SignalKind::kScrollInertiaCancel,
561+
};
562+
for (const PointerData::SignalKind& kind : signal_kinds) {
563+
PointerDataPacketConverter converter;
564+
auto packet = std::make_unique<PointerDataPacket>(6);
565+
PointerData data;
566+
CreateSimulatedMousePointerData(data, PointerData::Change::kAdd,
567+
PointerData::SignalKind::kNone, 0, 0.0, 0.0,
568+
0.0, 0.0, 0);
569+
packet->SetPointerData(0, data);
570+
CreateSimulatedMousePointerData(data, PointerData::Change::kAdd,
571+
PointerData::SignalKind::kNone, 1, 0.0, 0.0,
572+
0.0, 0.0, 0);
573+
packet->SetPointerData(1, data);
574+
CreateSimulatedMousePointerData(data, PointerData::Change::kDown,
575+
PointerData::SignalKind::kNone, 1, 0.0, 0.0,
576+
0.0, 0.0, 1);
577+
packet->SetPointerData(2, data);
578+
CreateSimulatedMousePointerData(data, PointerData::Change::kHover, kind, 0,
579+
34.0, 34.0, 30.0, 0.0, 0);
580+
packet->SetPointerData(3, data);
581+
CreateSimulatedMousePointerData(data, PointerData::Change::kHover, kind, 1,
582+
49.0, 49.0, 50.0, 0.0, 0);
583+
packet->SetPointerData(4, data);
584+
CreateSimulatedMousePointerData(data, PointerData::Change::kHover, kind, 2,
585+
10.0, 20.0, 30.0, 40.0, 0);
586+
packet->SetPointerData(5, data);
587+
auto converted_packet = converter.Convert(std::move(packet));
588+
589+
std::vector<PointerData> result;
590+
UnpackPointerPacket(result, std::move(converted_packet));
591+
592+
ASSERT_EQ(result.size(), (size_t)9);
593+
ASSERT_EQ(result[0].change, PointerData::Change::kAdd);
594+
ASSERT_EQ(result[0].signal_kind, PointerData::SignalKind::kNone);
595+
ASSERT_EQ(result[0].device, 0);
596+
ASSERT_EQ(result[0].physical_x, 0.0);
597+
ASSERT_EQ(result[0].physical_y, 0.0);
598+
ASSERT_EQ(result[0].synthesized, 0);
599+
600+
ASSERT_EQ(result[1].change, PointerData::Change::kAdd);
601+
ASSERT_EQ(result[1].signal_kind, PointerData::SignalKind::kNone);
602+
ASSERT_EQ(result[1].device, 1);
603+
ASSERT_EQ(result[1].physical_x, 0.0);
604+
ASSERT_EQ(result[1].physical_y, 0.0);
605+
ASSERT_EQ(result[1].synthesized, 0);
606+
607+
ASSERT_EQ(result[2].change, PointerData::Change::kDown);
608+
ASSERT_EQ(result[2].signal_kind, PointerData::SignalKind::kNone);
609+
ASSERT_EQ(result[2].device, 1);
610+
ASSERT_EQ(result[2].physical_x, 0.0);
611+
ASSERT_EQ(result[2].physical_y, 0.0);
612+
ASSERT_EQ(result[2].synthesized, 0);
613+
614+
// Converter will synthesize a hover to position for device 0.
615+
ASSERT_EQ(result[3].change, PointerData::Change::kHover);
616+
ASSERT_EQ(result[3].signal_kind, PointerData::SignalKind::kNone);
617+
ASSERT_EQ(result[3].device, 0);
618+
ASSERT_EQ(result[3].physical_x, 34.0);
619+
ASSERT_EQ(result[3].physical_y, 34.0);
620+
ASSERT_EQ(result[3].physical_delta_x, 34.0);
621+
ASSERT_EQ(result[3].physical_delta_y, 34.0);
622+
ASSERT_EQ(result[3].buttons, 0);
623+
ASSERT_EQ(result[3].synthesized, 1);
624+
625+
ASSERT_EQ(result[4].change, PointerData::Change::kHover);
626+
ASSERT_EQ(result[4].signal_kind, kind);
627+
ASSERT_EQ(result[4].device, 0);
628+
ASSERT_EQ(result[4].physical_x, 34.0);
629+
ASSERT_EQ(result[4].physical_y, 34.0);
630+
ASSERT_EQ(result[4].scroll_delta_x, 30.0);
631+
ASSERT_EQ(result[4].scroll_delta_y, 0.0);
632+
633+
// Converter will synthesize a move to position for device 1.
634+
ASSERT_EQ(result[5].change, PointerData::Change::kMove);
635+
ASSERT_EQ(result[5].signal_kind, PointerData::SignalKind::kNone);
636+
ASSERT_EQ(result[5].device, 1);
637+
ASSERT_EQ(result[5].physical_x, 49.0);
638+
ASSERT_EQ(result[5].physical_y, 49.0);
639+
ASSERT_EQ(result[5].physical_delta_x, 49.0);
640+
ASSERT_EQ(result[5].physical_delta_y, 49.0);
641+
ASSERT_EQ(result[5].buttons, 1);
642+
ASSERT_EQ(result[5].synthesized, 1);
643+
644+
ASSERT_EQ(result[6].change, PointerData::Change::kHover);
645+
ASSERT_EQ(result[6].signal_kind, kind);
646+
ASSERT_EQ(result[6].device, 1);
647+
ASSERT_EQ(result[6].physical_x, 49.0);
648+
ASSERT_EQ(result[6].physical_y, 49.0);
649+
ASSERT_EQ(result[6].scroll_delta_x, 50.0);
650+
ASSERT_EQ(result[6].scroll_delta_y, 0.0);
651+
652+
// Converter will synthesize an add for device 2.
653+
ASSERT_EQ(result[7].change, PointerData::Change::kAdd);
654+
ASSERT_EQ(result[7].signal_kind, PointerData::SignalKind::kNone);
655+
ASSERT_EQ(result[7].device, 2);
656+
ASSERT_EQ(result[7].physical_x, 10.0);
657+
ASSERT_EQ(result[7].physical_y, 20.0);
658+
ASSERT_EQ(result[7].synthesized, 1);
659+
660+
ASSERT_EQ(result[8].change, PointerData::Change::kHover);
661+
ASSERT_EQ(result[8].signal_kind, kind);
662+
ASSERT_EQ(result[8].device, 2);
663+
ASSERT_EQ(result[8].physical_x, 10.0);
664+
ASSERT_EQ(result[8].physical_y, 20.0);
665+
ASSERT_EQ(result[8].scroll_delta_x, 30.0);
666+
ASSERT_EQ(result[8].scroll_delta_y, 40.0);
667+
}
665668
}
666669

667670
TEST(PointerDataPacketConverterTest, CanConvertTrackpadGesture) {

shell/platform/embedder/embedder.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1711,6 +1711,8 @@ inline flutter::PointerData::SignalKind ToPointerDataSignalKind(
17111711
return flutter::PointerData::SignalKind::kNone;
17121712
case kFlutterPointerSignalKindScroll:
17131713
return flutter::PointerData::SignalKind::kScroll;
1714+
case kFlutterPointerSignalKindScrollInertiaCancel:
1715+
return flutter::PointerData::SignalKind::kScrollInertiaCancel;
17141716
}
17151717
return flutter::PointerData::SignalKind::kNone;
17161718
}

shell/platform/embedder/embedder.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -773,6 +773,7 @@ typedef enum {
773773
typedef enum {
774774
kFlutterPointerSignalKindNone,
775775
kFlutterPointerSignalKindScroll,
776+
kFlutterPointerSignalKindScrollInertiaCancel,
776777
} FlutterPointerSignalKind;
777778

778779
typedef struct {

0 commit comments

Comments
 (0)