From b92b9bdb6a8bbe83aab66cb852942bef9ba0ceda Mon Sep 17 00:00:00 2001 From: Callum Moffat Date: Tue, 27 Sep 2022 11:30:14 -0400 Subject: [PATCH] Add discrete scale pointer signal (flutter/engine#36342) --- engine/src/flutter/lib/ui/pointer.dart | 3 +++ engine/src/flutter/lib/ui/window/pointer_data.h | 1 + .../flutter/lib/ui/window/pointer_data_packet_converter.cc | 3 ++- .../lib/ui/window/pointer_data_packet_converter_unittests.cc | 1 + engine/src/flutter/lib/web_ui/lib/pointer.dart | 1 + .../flutter/lib/web_ui/lib/src/engine/pointer_converter.dart | 1 + .../io/flutter/embedding/android/AndroidTouchProcessor.java | 4 +++- engine/src/flutter/shell/platform/embedder/embedder.cc | 2 ++ engine/src/flutter/shell/platform/embedder/embedder.h | 1 + 9 files changed, 15 insertions(+), 2 deletions(-) diff --git a/engine/src/flutter/lib/ui/pointer.dart b/engine/src/flutter/lib/ui/pointer.dart index 91201aee24..059e41ac6d 100644 --- a/engine/src/flutter/lib/ui/pointer.dart +++ b/engine/src/flutter/lib/ui/pointer.dart @@ -130,6 +130,9 @@ enum PointerSignalKind { /// A pointer-generated scroll-inertia cancel. scrollInertiaCancel, + /// A pointer-generated scale event (e.g. trackpad pinch). + scale, + /// An unknown pointer signal kind. unknown } diff --git a/engine/src/flutter/lib/ui/window/pointer_data.h b/engine/src/flutter/lib/ui/window/pointer_data.h index 4386fd184f..7a57f176eb 100644 --- a/engine/src/flutter/lib/ui/window/pointer_data.h +++ b/engine/src/flutter/lib/ui/window/pointer_data.h @@ -61,6 +61,7 @@ struct alignas(8) PointerData { kNone, kScroll, kScrollInertiaCancel, + kScale, }; int64_t embedder_id; diff --git a/engine/src/flutter/lib/ui/window/pointer_data_packet_converter.cc b/engine/src/flutter/lib/ui/window/pointer_data_packet_converter.cc index e98558d490..dc6681e2d0 100644 --- a/engine/src/flutter/lib/ui/window/pointer_data_packet_converter.cc +++ b/engine/src/flutter/lib/ui/window/pointer_data_packet_converter.cc @@ -298,7 +298,8 @@ void PointerDataPacketConverter::ConvertPointerData( } else { switch (pointer_data.signal_kind) { case PointerData::SignalKind::kScroll: - case PointerData::SignalKind::kScrollInertiaCancel: { + case PointerData::SignalKind::kScrollInertiaCancel: + case PointerData::SignalKind::kScale: { // Makes sure we have an existing pointer auto iter = states_.find(pointer_data.device); PointerState state; diff --git a/engine/src/flutter/lib/ui/window/pointer_data_packet_converter_unittests.cc b/engine/src/flutter/lib/ui/window/pointer_data_packet_converter_unittests.cc index 8a78aa4098..bc858334e8 100644 --- a/engine/src/flutter/lib/ui/window/pointer_data_packet_converter_unittests.cc +++ b/engine/src/flutter/lib/ui/window/pointer_data_packet_converter_unittests.cc @@ -558,6 +558,7 @@ TEST(PointerDataPacketConverterTest, CanConvertPointerSignals) { PointerData::SignalKind signal_kinds[] = { PointerData::SignalKind::kScroll, PointerData::SignalKind::kScrollInertiaCancel, + PointerData::SignalKind::kScale, }; for (const PointerData::SignalKind& kind : signal_kinds) { PointerDataPacketConverter converter; diff --git a/engine/src/flutter/lib/web_ui/lib/pointer.dart b/engine/src/flutter/lib/web_ui/lib/pointer.dart index 3106f903d3..254afafe5f 100644 --- a/engine/src/flutter/lib/web_ui/lib/pointer.dart +++ b/engine/src/flutter/lib/web_ui/lib/pointer.dart @@ -30,6 +30,7 @@ enum PointerSignalKind { none, scroll, scrollInertiaCancel, + scale, unknown } diff --git a/engine/src/flutter/lib/web_ui/lib/src/engine/pointer_converter.dart b/engine/src/flutter/lib/web_ui/lib/src/engine/pointer_converter.dart index 4f94cd49b8..568577fe30 100644 --- a/engine/src/flutter/lib/web_ui/lib/src/engine/pointer_converter.dart +++ b/engine/src/flutter/lib/web_ui/lib/src/engine/pointer_converter.dart @@ -624,6 +624,7 @@ class PointerDataConverter { switch (signalKind) { case ui.PointerSignalKind.scroll: case ui.PointerSignalKind.scrollInertiaCancel: + case ui.PointerSignalKind.scale: final bool alreadyAdded = _pointers.containsKey(device); _ensureStateForPointer(device, physicalX, physicalY); if (!alreadyAdded) { diff --git a/engine/src/flutter/shell/platform/android/io/flutter/embedding/android/AndroidTouchProcessor.java b/engine/src/flutter/shell/platform/android/io/flutter/embedding/android/AndroidTouchProcessor.java index 99179fcb30..6febe9e3c4 100644 --- a/engine/src/flutter/shell/platform/android/io/flutter/embedding/android/AndroidTouchProcessor.java +++ b/engine/src/flutter/shell/platform/android/io/flutter/embedding/android/AndroidTouchProcessor.java @@ -65,13 +65,15 @@ public class AndroidTouchProcessor { PointerSignalKind.NONE, PointerSignalKind.SCROLL, PointerSignalKind.SCROLL_INERTIA_CANCEL, + PointerSignalKind.SCALE, PointerSignalKind.UNKNOWN }) public @interface PointerSignalKind { int NONE = 0; int SCROLL = 1; int SCROLL_INERTIA_CANCEL = 2; - int UNKNOWN = 3; + int SCALE = 3; + int UNKNOWN = 4; } // Must match the unpacking code in hooks.dart. diff --git a/engine/src/flutter/shell/platform/embedder/embedder.cc b/engine/src/flutter/shell/platform/embedder/embedder.cc index 4bf972aaf6..dcb19c0202 100644 --- a/engine/src/flutter/shell/platform/embedder/embedder.cc +++ b/engine/src/flutter/shell/platform/embedder/embedder.cc @@ -1924,6 +1924,8 @@ inline flutter::PointerData::SignalKind ToPointerDataSignalKind( return flutter::PointerData::SignalKind::kScroll; case kFlutterPointerSignalKindScrollInertiaCancel: return flutter::PointerData::SignalKind::kScrollInertiaCancel; + case kFlutterPointerSignalKindScale: + return flutter::PointerData::SignalKind::kScale; } return flutter::PointerData::SignalKind::kNone; } diff --git a/engine/src/flutter/shell/platform/embedder/embedder.h b/engine/src/flutter/shell/platform/embedder/embedder.h index c8a90ff1cb..c12452c788 100644 --- a/engine/src/flutter/shell/platform/embedder/embedder.h +++ b/engine/src/flutter/shell/platform/embedder/embedder.h @@ -875,6 +875,7 @@ typedef enum { kFlutterPointerSignalKindNone, kFlutterPointerSignalKindScroll, kFlutterPointerSignalKindScrollInertiaCancel, + kFlutterPointerSignalKindScale, } FlutterPointerSignalKind; typedef struct {