From b0c6a9a1d6eff271540edd3041373c1596583c8b Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Wed, 15 Aug 2018 16:14:03 -0700 Subject: [PATCH 1/6] Add PoC scrollwheel support --- lib/ui/hooks.dart | 6 +++-- lib/ui/pointer.dart | 23 +++++++++++++++++-- lib/ui/window/pointer_data.cc | 2 +- lib/ui/window/pointer_data.h | 3 +++ .../android/io/flutter/view/FlutterView.java | 2 +- .../platform/darwin/desktop/flutter_window.mm | 2 ++ shell/platform/embedder/embedder.cc | 6 +++++ shell/platform/embedder/embedder.h | 4 ++++ 8 files changed, 42 insertions(+), 6 deletions(-) diff --git a/lib/ui/hooks.dart b/lib/ui/hooks.dart index f644ef8481c0d..4adca46d982cb 100644 --- a/lib/ui/hooks.dart +++ b/lib/ui/hooks.dart @@ -179,7 +179,7 @@ void _invoke3(void callback(A1 a1, A2 a2, A3 a3), Zone zone, A1 arg1 // // * pointer_data.cc // * FlutterView.java -const int _kPointerDataFieldCount = 19; +const int _kPointerDataFieldCount = 21; PointerDataPacket _unpackPointerDataPacket(ByteData packet) { const int kStride = Int64List.bytesPerElement; @@ -208,7 +208,9 @@ PointerDataPacket _unpackPointerDataPacket(ByteData packet) { radiusMin: packet.getFloat64(kStride * offset++, _kFakeHostEndian), radiusMax: packet.getFloat64(kStride * offset++, _kFakeHostEndian), orientation: packet.getFloat64(kStride * offset++, _kFakeHostEndian), - tilt: packet.getFloat64(kStride * offset++, _kFakeHostEndian) + tilt: packet.getFloat64(kStride * offset++, _kFakeHostEndian), + scrollDeltaX: packet.getFloat64(kStride * offset++, _kFakeHostEndian), + scrollDeltaY: packet.getFloat64(kStride * offset++, _kFakeHostEndian) ); assert(offset == (i + 1) * _kPointerDataFieldCount); } diff --git a/lib/ui/pointer.dart b/lib/ui/pointer.dart index 98a4f92385e95..d7d5cfac8315d 100644 --- a/lib/ui/pointer.dart +++ b/lib/ui/pointer.dart @@ -34,6 +34,9 @@ enum PointerChange { /// The pointer has stopped making contact with the device. up, + + /// The pointer issued a scroll event (e.g., a mouse wheel). + scroll, } /// The kind of pointer device. @@ -76,7 +79,9 @@ class PointerData { this.radiusMin: 0.0, this.radiusMax: 0.0, this.orientation: 0.0, - this.tilt: 0.0 + this.tilt: 0.0, + this.scrollDeltaX: 0.0, + this.scrollDeltaY: 0.0, }); /// Time of event dispatch, relative to an arbitrary timeline. @@ -190,6 +195,18 @@ class PointerData { /// the stylus is flat on that surface). final double tilt; + /// For PointerChange.scroll: + /// + /// The amount to scroll in the x direction, in {XXX physical pixels? + /// Logical pixels?}. + final double scrollDeltaX; + + /// For PointerChange.scroll: + /// + /// The amount to scroll in the y direction, in {XXX physical pixels? + /// Logical pixels?}. + final double scrollDeltaY; + @override String toString() => '$runtimeType(x: $physicalX, y: $physicalY)'; @@ -213,7 +230,9 @@ class PointerData { 'radiusMin: $radiusMin, ' 'radiusMax: $radiusMax, ' 'orientation: $orientation, ' - 'tilt: $tilt' + 'tilt: $tilt, ' + 'scrollDeltaX: $scrollDeltaX, ' + 'scrollDeltaY: $scrollDeltaY' ')'; } } diff --git a/lib/ui/window/pointer_data.cc b/lib/ui/window/pointer_data.cc index c85a1a50b8e72..563d6bc2e4c6b 100644 --- a/lib/ui/window/pointer_data.cc +++ b/lib/ui/window/pointer_data.cc @@ -9,7 +9,7 @@ namespace blink { // If this value changes, update the pointer data unpacking code in hooks.dart. -static constexpr int kPointerDataFieldCount = 19; +static constexpr int kPointerDataFieldCount = 21; static_assert(sizeof(PointerData) == sizeof(int64_t) * kPointerDataFieldCount, "PointerData has the wrong size"); diff --git a/lib/ui/window/pointer_data.h b/lib/ui/window/pointer_data.h index 6a23c3d689d2e..92c41cb06b027 100644 --- a/lib/ui/window/pointer_data.h +++ b/lib/ui/window/pointer_data.h @@ -20,6 +20,7 @@ struct alignas(8) PointerData { kDown, kMove, kUp, + kScroll, }; // Must match the PointerDeviceKind enum in pointer.dart. @@ -49,6 +50,8 @@ struct alignas(8) PointerData { double radius_max; double orientation; double tilt; + double scroll_delta_x; + double scroll_delta_y; void Clear(); }; diff --git a/shell/platform/android/io/flutter/view/FlutterView.java b/shell/platform/android/io/flutter/view/FlutterView.java index b28ffa054d2be..764289893ff1d 100644 --- a/shell/platform/android/io/flutter/view/FlutterView.java +++ b/shell/platform/android/io/flutter/view/FlutterView.java @@ -497,7 +497,7 @@ public boolean onTouchEvent(MotionEvent event) { } // These values must match the unpacking code in hooks.dart. - final int kPointerDataFieldCount = 19; + final int kPointerDataFieldCount = 21; final int kBytePerField = 8; int pointerCount = event.getPointerCount(); diff --git a/shell/platform/darwin/desktop/flutter_window.mm b/shell/platform/darwin/desktop/flutter_window.mm index 28591b950dc7f..8bcc50b67626d 100644 --- a/shell/platform/darwin/desktop/flutter_window.mm +++ b/shell/platform/darwin/desktop/flutter_window.mm @@ -229,6 +229,8 @@ - (void)dispatchEvent:(NSEvent*)event phase:(NSEventPhase)phase { case blink::PointerData::Change::kHover: FML_DCHECK(!_mouseIsDown); break; + case blink::PointerData::Change::kScroll: + break; } _shell->GetTaskRunners().GetUITaskRunner()->PostTask( diff --git a/shell/platform/embedder/embedder.cc b/shell/platform/embedder/embedder.cc index d77ac0764b2a3..91a07cf408c0f 100644 --- a/shell/platform/embedder/embedder.cc +++ b/shell/platform/embedder/embedder.cc @@ -285,6 +285,10 @@ inline blink::PointerData::Change ToPointerDataChange( return blink::PointerData::Change::kDown; case kMove: return blink::PointerData::Change::kMove; + case kHover: + return blink::PointerData::Change::kHover; + case kScroll: + return blink::PointerData::Change::kScroll; } return blink::PointerData::Change::kCancel; } @@ -309,6 +313,8 @@ FlutterResult FlutterEngineSendPointerEvent(FlutterEngine engine, pointer_data.kind = blink::PointerData::DeviceKind::kMouse; pointer_data.physical_x = SAFE_ACCESS(current, x, 0.0); pointer_data.physical_y = SAFE_ACCESS(current, y, 0.0); + pointer_data.scroll_delta_x = SAFE_ACCESS(current, scroll_delta_x, 0.0); + pointer_data.scroll_delta_y = SAFE_ACCESS(current, scroll_delta_y, 0.0); packet->SetPointerData(i, pointer_data); current = reinterpret_cast( reinterpret_cast(current) + current->struct_size); diff --git a/shell/platform/embedder/embedder.h b/shell/platform/embedder/embedder.h index a4c6d7fa39ea0..08be4fe6a1ac2 100644 --- a/shell/platform/embedder/embedder.h +++ b/shell/platform/embedder/embedder.h @@ -67,6 +67,8 @@ typedef enum { kUp, kDown, kMove, + kHover, + kScroll, } FlutterPointerPhase; typedef struct { @@ -76,6 +78,8 @@ typedef struct { size_t timestamp; // in microseconds. double x; double y; + double scroll_delta_x; + double scroll_delta_y; } FlutterPointerEvent; struct _FlutterPlatformMessageResponseHandle; From 77ed463ef8e1baee08cd228c55c13493d48e6a8d Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Wed, 29 Aug 2018 14:49:43 -0700 Subject: [PATCH 2/6] Rework to better allow for future gesture-based scrolling --- lib/ui/hooks.dart | 3 +- lib/ui/pointer.dart | 30 +++++++++++----- lib/ui/window/pointer_data.cc | 2 +- lib/ui/window/pointer_data.h | 8 ++++- .../android/io/flutter/view/FlutterView.java | 2 +- .../platform/darwin/desktop/flutter_window.mm | 2 -- shell/platform/embedder/embedder.cc | 35 +++++++++++++++++-- shell/platform/embedder/embedder.h | 17 ++++++++- 8 files changed, 81 insertions(+), 18 deletions(-) diff --git a/lib/ui/hooks.dart b/lib/ui/hooks.dart index 4adca46d982cb..718ee88ab4fb1 100644 --- a/lib/ui/hooks.dart +++ b/lib/ui/hooks.dart @@ -179,7 +179,7 @@ void _invoke3(void callback(A1 a1, A2 a2, A3 a3), Zone zone, A1 arg1 // // * pointer_data.cc // * FlutterView.java -const int _kPointerDataFieldCount = 21; +const int _kPointerDataFieldCount = 22; PointerDataPacket _unpackPointerDataPacket(ByteData packet) { const int kStride = Int64List.bytesPerElement; @@ -193,6 +193,7 @@ PointerDataPacket _unpackPointerDataPacket(ByteData packet) { timeStamp: new Duration(microseconds: packet.getInt64(kStride * offset++, _kFakeHostEndian)), change: PointerChange.values[packet.getInt64(kStride * offset++, _kFakeHostEndian)], kind: PointerDeviceKind.values[packet.getInt64(kStride * offset++, _kFakeHostEndian)], + gestureKind: PointerGestureKind.values[packet.getInt64(kStride * offset++, _kFakeHostEndian)], device: packet.getInt64(kStride * offset++, _kFakeHostEndian), physicalX: packet.getFloat64(kStride * offset++, _kFakeHostEndian), physicalY: packet.getFloat64(kStride * offset++, _kFakeHostEndian), diff --git a/lib/ui/pointer.dart b/lib/ui/pointer.dart index d7d5cfac8315d..261f6954be0b4 100644 --- a/lib/ui/pointer.dart +++ b/lib/ui/pointer.dart @@ -34,9 +34,6 @@ enum PointerChange { /// The pointer has stopped making contact with the device. up, - - /// The pointer issued a scroll event (e.g., a mouse wheel). - scroll, } /// The kind of pointer device. @@ -53,10 +50,22 @@ enum PointerDeviceKind { /// A pointer device with a stylus that has been inverted. invertedStylus, + /// A pointer that generates gestures at a point (e.g., a trackpad). + gesture, + /// An unknown pointer device. unknown } +/// The kind of [PointerDeviceKind.gesture]. +enum PointerGestureKind { + /// A pointer-generated scroll (e.g., mouse wheel or trackpad scroll). + scroll, + + /// An unknown pointer gesture kind. + unknown +} + /// Information about the state of a pointer. class PointerData { /// Creates an object that represents the state of a pointer. @@ -64,6 +73,7 @@ class PointerData { this.timeStamp: Duration.zero, this.change: PointerChange.cancel, this.kind: PointerDeviceKind.touch, + this.gestureKind, this.device: 0, this.physicalX: 0.0, this.physicalY: 0.0, @@ -93,6 +103,9 @@ class PointerData { /// The kind of input device for which the event was generated. final PointerDeviceKind kind; + /// The kind of gesture for a gesture pointer event. + final PointerGestureKind gestureKind; + /// Unique identifier for the pointing device, reused across interactions. final int device; @@ -195,16 +208,14 @@ class PointerData { /// the stylus is flat on that surface). final double tilt; - /// For PointerChange.scroll: + /// For PointerDeviceKind.gesture with PointerGestureKind.scroll: /// - /// The amount to scroll in the x direction, in {XXX physical pixels? - /// Logical pixels?}. + /// The amount to scroll in the x direction, in physical pixels. final double scrollDeltaX; - /// For PointerChange.scroll: + /// For PointerDeviceKind.gesture with PointerGestureKind.scroll: /// - /// The amount to scroll in the y direction, in {XXX physical pixels? - /// Logical pixels?}. + /// The amount to scroll in the y direction, in physical pixels. final double scrollDeltaY; @override @@ -216,6 +227,7 @@ class PointerData { 'timeStamp: $timeStamp, ' 'change: $change, ' 'kind: $kind, ' + 'gestureKind: $gestureKind, ' 'device: $device, ' 'physicalX: $physicalX, ' 'physicalY: $physicalY, ' diff --git a/lib/ui/window/pointer_data.cc b/lib/ui/window/pointer_data.cc index 563d6bc2e4c6b..c61411e2a77da 100644 --- a/lib/ui/window/pointer_data.cc +++ b/lib/ui/window/pointer_data.cc @@ -9,7 +9,7 @@ namespace blink { // If this value changes, update the pointer data unpacking code in hooks.dart. -static constexpr int kPointerDataFieldCount = 21; +static constexpr int kPointerDataFieldCount = 22; static_assert(sizeof(PointerData) == sizeof(int64_t) * kPointerDataFieldCount, "PointerData has the wrong size"); diff --git a/lib/ui/window/pointer_data.h b/lib/ui/window/pointer_data.h index 92c41cb06b027..5de23ede6fd8f 100644 --- a/lib/ui/window/pointer_data.h +++ b/lib/ui/window/pointer_data.h @@ -20,7 +20,6 @@ struct alignas(8) PointerData { kDown, kMove, kUp, - kScroll, }; // Must match the PointerDeviceKind enum in pointer.dart. @@ -29,11 +28,18 @@ struct alignas(8) PointerData { kMouse, kStylus, kInvertedStylus, + kGesture, + }; + + // Must match the PointerGestureKind enum in pointer.dart. + enum class GestureKind : int64_t { + kScroll, }; int64_t time_stamp; Change change; DeviceKind kind; + GestureKind gesture_kind; int64_t device; double physical_x; double physical_y; diff --git a/shell/platform/android/io/flutter/view/FlutterView.java b/shell/platform/android/io/flutter/view/FlutterView.java index 764289893ff1d..34ed7aeeaaf34 100644 --- a/shell/platform/android/io/flutter/view/FlutterView.java +++ b/shell/platform/android/io/flutter/view/FlutterView.java @@ -497,7 +497,7 @@ public boolean onTouchEvent(MotionEvent event) { } // These values must match the unpacking code in hooks.dart. - final int kPointerDataFieldCount = 21; + final int kPointerDataFieldCount = 22; final int kBytePerField = 8; int pointerCount = event.getPointerCount(); diff --git a/shell/platform/darwin/desktop/flutter_window.mm b/shell/platform/darwin/desktop/flutter_window.mm index 8bcc50b67626d..28591b950dc7f 100644 --- a/shell/platform/darwin/desktop/flutter_window.mm +++ b/shell/platform/darwin/desktop/flutter_window.mm @@ -229,8 +229,6 @@ - (void)dispatchEvent:(NSEvent*)event phase:(NSEventPhase)phase { case blink::PointerData::Change::kHover: FML_DCHECK(!_mouseIsDown); break; - case blink::PointerData::Change::kScroll: - break; } _shell->GetTaskRunners().GetUITaskRunner()->PostTask( diff --git a/shell/platform/embedder/embedder.cc b/shell/platform/embedder/embedder.cc index 91a07cf408c0f..1a227c1e848ad 100644 --- a/shell/platform/embedder/embedder.cc +++ b/shell/platform/embedder/embedder.cc @@ -274,6 +274,20 @@ FlutterResult FlutterEngineSendWindowMetricsEvent( : kInvalidArguments; } +// Returns the blink::PointerData::DeviceKind for the given +// FlutterPointerDeviceKind. +inline blink::PointerData::DeviceKind ToPointerDataDeviceKind( + FlutterPointerDeviceKind kind) { + switch (kind) { + case kMouse: + return blink::PointerData::DeviceKind::kMouse; + case kGesture: + return blink::PointerData::DeviceKind::kGesture; + } + return blink::PointerData::DeviceKind::kMouse; +} + +// Returns the blink::PointerData::Change for the given FlutterPointerPhase. inline blink::PointerData::Change ToPointerDataChange( FlutterPointerPhase phase) { switch (phase) { @@ -285,14 +299,27 @@ inline blink::PointerData::Change ToPointerDataChange( return blink::PointerData::Change::kDown; case kMove: return blink::PointerData::Change::kMove; + case kAdd: + return blink::PointerData::Change::kAdd; + case kRemove: + return blink::PointerData::Change::kRemove; case kHover: return blink::PointerData::Change::kHover; - case kScroll: - return blink::PointerData::Change::kScroll; } return blink::PointerData::Change::kCancel; } +// Returns the blink::PointerData::GestureKind for the given +// FlutterPointerGestureKind. +inline blink::PointerData::GestureKind ToPointerDataGestureKind( + FlutterPointerGestureKind kind) { + switch (kind) { + case kScroll: + return blink::PointerData::GestureKind::kScroll; + } + return blink::PointerData::GestureKind::kScroll; +} + FlutterResult FlutterEngineSendPointerEvent(FlutterEngine engine, const FlutterPointerEvent* pointers, size_t events_count) { @@ -313,6 +340,10 @@ FlutterResult FlutterEngineSendPointerEvent(FlutterEngine engine, pointer_data.kind = blink::PointerData::DeviceKind::kMouse; pointer_data.physical_x = SAFE_ACCESS(current, x, 0.0); pointer_data.physical_y = SAFE_ACCESS(current, y, 0.0); + pointer_data.kind = ToPointerDataDeviceKind( + SAFE_ACCESS(current, kind, FlutterPointerDeviceKind::kMouse)); + pointer_data.gesture_kind = ToPointerDataGestureKind( + SAFE_ACCESS(current, gesture_kind, FlutterPointerGestureKind::kScroll)); pointer_data.scroll_delta_x = SAFE_ACCESS(current, scroll_delta_x, 0.0); pointer_data.scroll_delta_y = SAFE_ACCESS(current, scroll_delta_y, 0.0); packet->SetPointerData(i, pointer_data); diff --git a/shell/platform/embedder/embedder.h b/shell/platform/embedder/embedder.h index 08be4fe6a1ac2..c9dcf170409d3 100644 --- a/shell/platform/embedder/embedder.h +++ b/shell/platform/embedder/embedder.h @@ -62,15 +62,28 @@ typedef struct { double pixel_ratio; } FlutterWindowMetricsEvent; +// The kind of device generating a pointer event. +typedef enum { + kMouse, + kGesture, +} FlutterPointerDeviceKind; + +// The phase of the pointer event. typedef enum { kCancel, kUp, kDown, kMove, + kAdd, + kRemove, kHover, - kScroll, } FlutterPointerPhase; +// The type of a pointer gesture (e.g., trackpad event). +typedef enum { + kScroll, +} FlutterPointerGestureKind; + typedef struct { // The size of this struct. Must be sizeof(FlutterPointerEvent). size_t struct_size; @@ -78,6 +91,8 @@ typedef struct { size_t timestamp; // in microseconds. double x; double y; + FlutterPointerDeviceKind kind; + FlutterPointerGestureKind gesture_kind; // ignored unless kind is kGesture. double scroll_delta_x; double scroll_delta_y; } FlutterPointerEvent; From aa2d55fe67496b5559859c35b4c26592874a7f19 Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Thu, 30 Aug 2018 15:56:31 -0700 Subject: [PATCH 3/6] Fix Android PointerData construction (speculative) --- .../android/io/flutter/view/FlutterView.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/shell/platform/android/io/flutter/view/FlutterView.java b/shell/platform/android/io/flutter/view/FlutterView.java index 34ed7aeeaaf34..41da7e4ffd1e4 100644 --- a/shell/platform/android/io/flutter/view/FlutterView.java +++ b/shell/platform/android/io/flutter/view/FlutterView.java @@ -382,7 +382,12 @@ public InputConnection onCreateInputConnection(EditorInfo outAttrs) { private static final int kPointerDeviceKindMouse = 1; private static final int kPointerDeviceKindStylus = 2; private static final int kPointerDeviceKindInvertedStylus = 3; - private static final int kPointerDeviceKindUnknown = 4; + private static final int kPointerDeviceKindGesture = 4; + private static final int kPointerDeviceKindUnknown = 5; + + // Must match the PointerGestureKind enum in pointer.dart. + private static final int kPointerGestureKindScroll = 0; + private static final int kPointerGestureKindUnknown = 1; private int getPointerChangeForAction(int maskedAction) { // Primary pointer: @@ -433,11 +438,15 @@ private void addPointerForIndex(MotionEvent event, int pointerIndex, ByteBuffer int pointerKind = getPointerDeviceTypeForToolType(event.getToolType(pointerIndex)); + // This is ignored for non-gesture deviced kinds. + int gestureKind = kPointerGestureKindScroll; + long timeStamp = event.getEventTime() * 1000; // Convert from milliseconds to microseconds. packet.putLong(timeStamp); // time_stamp packet.putLong(pointerChange); // change packet.putLong(pointerKind); // kind + packet.putLong(gestureKind); // gesture_kind packet.putLong(event.getPointerId(pointerIndex)); // device packet.putDouble(event.getX(pointerIndex)); // physical_x packet.putDouble(event.getY(pointerIndex)); // physical_y @@ -479,6 +488,9 @@ private void addPointerForIndex(MotionEvent event, int pointerIndex, ByteBuffer } else { packet.putDouble(0.0); // tilt } + + packet.putDouble(0.0); // scroll_delta_x + packet.putDouble(0.0); // scroll_delta_y } @Override From 346a77c708fccfedee9970cb804cfccd8d343ebd Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Tue, 12 Feb 2019 12:37:50 -0800 Subject: [PATCH 4/6] Rename gesture to signal --- lib/ui/hooks.dart | 2 +- lib/ui/pointer.dart | 25 ++++++++++--------- lib/ui/window/pointer_data.h | 8 +++--- .../android/io/flutter/view/FlutterView.java | 14 +++++------ shell/platform/embedder/embedder.cc | 20 +++++++-------- shell/platform/embedder/embedder.h | 8 +++--- 6 files changed, 39 insertions(+), 38 deletions(-) diff --git a/lib/ui/hooks.dart b/lib/ui/hooks.dart index 02a94ea4e7684..e88580a95ce06 100644 --- a/lib/ui/hooks.dart +++ b/lib/ui/hooks.dart @@ -273,7 +273,7 @@ PointerDataPacket _unpackPointerDataPacket(ByteData packet) { timeStamp: new Duration(microseconds: packet.getInt64(kStride * offset++, _kFakeHostEndian)), change: PointerChange.values[packet.getInt64(kStride * offset++, _kFakeHostEndian)], kind: PointerDeviceKind.values[packet.getInt64(kStride * offset++, _kFakeHostEndian)], - gestureKind: PointerGestureKind.values[packet.getInt64(kStride * offset++, _kFakeHostEndian)], + signalKind: PointerSignalKind.values[packet.getInt64(kStride * offset++, _kFakeHostEndian)], device: packet.getInt64(kStride * offset++, _kFakeHostEndian), physicalX: packet.getFloat64(kStride * offset++, _kFakeHostEndian), physicalY: packet.getFloat64(kStride * offset++, _kFakeHostEndian), diff --git a/lib/ui/pointer.dart b/lib/ui/pointer.dart index e397f171a1f98..232d1018548bd 100644 --- a/lib/ui/pointer.dart +++ b/lib/ui/pointer.dart @@ -50,19 +50,20 @@ enum PointerDeviceKind { /// A pointer device with a stylus that has been inverted. invertedStylus, - /// A pointer that generates gestures at a point (e.g., a trackpad). - gesture, + /// A pointer that is generating signals at its location. Examples include + /// a mouse scroll wheel, or trackpad gestures such as scroll and pinch. + signal, /// An unknown pointer device. unknown } -/// The kind of [PointerDeviceKind.gesture]. -enum PointerGestureKind { +/// The kind of [PointerDeviceKind.signal]. +enum PointerSignalKind { /// A pointer-generated scroll (e.g., mouse wheel or trackpad scroll). scroll, - /// An unknown pointer gesture kind. + /// An unknown pointer signal kind. unknown } @@ -73,7 +74,7 @@ class PointerData { this.timeStamp: Duration.zero, this.change: PointerChange.cancel, this.kind: PointerDeviceKind.touch, - this.gestureKind, + this.signalKind, this.device: 0, this.physicalX: 0.0, this.physicalY: 0.0, @@ -105,8 +106,8 @@ class PointerData { /// The kind of input device for which the event was generated. final PointerDeviceKind kind; - /// The kind of gesture for a gesture pointer event. - final PointerGestureKind gestureKind; + /// The kind of signal for a pointer signal event. + final PointerSignalKind signalKind; /// Unique identifier for the pointing device, reused across interactions. final int device; @@ -221,12 +222,12 @@ class PointerData { /// Opaque platform-specific data associated with the event. final int platformData; - /// For PointerDeviceKind.gesture with PointerGestureKind.scroll: + /// For PointerDeviceKind.signal with PointerSignalKind.scroll: /// /// The amount to scroll in the x direction, in physical pixels. final double scrollDeltaX; - /// For PointerDeviceKind.gesture with PointerGestureKind.scroll: + /// For PointerDeviceKind.signal with PointerSignalKind.scroll: /// /// The amount to scroll in the y direction, in physical pixels. final double scrollDeltaY; @@ -240,7 +241,7 @@ class PointerData { 'timeStamp: $timeStamp, ' 'change: $change, ' 'kind: $kind, ' - 'gestureKind: $gestureKind, ' + 'signalKind: $signalKind, ' 'device: $device, ' 'physicalX: $physicalX, ' 'physicalY: $physicalY, ' @@ -257,7 +258,7 @@ class PointerData { 'radiusMax: $radiusMax, ' 'orientation: $orientation, ' 'tilt: $tilt, ' - 'platformData: $platformData' + 'platformData: $platformData, ' 'scrollDeltaX: $scrollDeltaX, ' 'scrollDeltaY: $scrollDeltaY' ')'; diff --git a/lib/ui/window/pointer_data.h b/lib/ui/window/pointer_data.h index 113ee8ece0f06..a1d68fdfa6af6 100644 --- a/lib/ui/window/pointer_data.h +++ b/lib/ui/window/pointer_data.h @@ -28,18 +28,18 @@ struct alignas(8) PointerData { kMouse, kStylus, kInvertedStylus, - kGesture, + kSignal, }; - // Must match the PointerGestureKind enum in pointer.dart. - enum class GestureKind : int64_t { + // Must match the PointerSignalKind enum in pointer.dart. + enum class SignalKind : int64_t { kScroll, }; int64_t time_stamp; Change change; DeviceKind kind; - GestureKind gesture_kind; + SignalKind signal_kind; int64_t device; double physical_x; double physical_y; diff --git a/shell/platform/android/io/flutter/view/FlutterView.java b/shell/platform/android/io/flutter/view/FlutterView.java index 6757dcd8b20df..98f99b669be0b 100644 --- a/shell/platform/android/io/flutter/view/FlutterView.java +++ b/shell/platform/android/io/flutter/view/FlutterView.java @@ -395,12 +395,12 @@ public InputConnection onCreateInputConnection(EditorInfo outAttrs) { private static final int kPointerDeviceKindMouse = 1; private static final int kPointerDeviceKindStylus = 2; private static final int kPointerDeviceKindInvertedStylus = 3; - private static final int kPointerDeviceKindGesture = 4; + private static final int kPointerDeviceKindSignal = 4; private static final int kPointerDeviceKindUnknown = 5; - // Must match the PointerGestureKind enum in pointer.dart. - private static final int kPointerGestureKindScroll = 0; - private static final int kPointerGestureKindUnknown = 1; + // Must match the PointerSignalKind enum in pointer.dart. + private static final int kPointerSignalKindScroll = 0; + private static final int kPointerSignalKindUnknown = 1; // These values must match the unpacking code in hooks.dart. private static final int kPointerDataFieldCount = 24; @@ -458,15 +458,15 @@ private void addPointerForIndex(MotionEvent event, int pointerIndex, int pointer int pointerKind = getPointerDeviceTypeForToolType(event.getToolType(pointerIndex)); - // This is ignored for non-gesture deviced kinds. - int gestureKind = kPointerGestureKindScroll; + // This is ignored for non-signal device kinds. + int signalKind = kPointerSignalKindScroll; long timeStamp = event.getEventTime() * 1000; // Convert from milliseconds to microseconds. packet.putLong(timeStamp); // time_stamp packet.putLong(pointerChange); // change packet.putLong(pointerKind); // kind - packet.putLong(gestureKind); // gesture_kind + packet.putLong(signalKind); // signal_kind packet.putLong(event.getPointerId(pointerIndex)); // device packet.putDouble(event.getX(pointerIndex)); // physical_x packet.putDouble(event.getY(pointerIndex)); // physical_y diff --git a/shell/platform/embedder/embedder.cc b/shell/platform/embedder/embedder.cc index 436809ca8f82e..e2e68e6c91220 100644 --- a/shell/platform/embedder/embedder.cc +++ b/shell/platform/embedder/embedder.cc @@ -547,8 +547,8 @@ inline blink::PointerData::DeviceKind ToPointerDataDeviceKind( switch (kind) { case kMouse: return blink::PointerData::DeviceKind::kMouse; - case kGesture: - return blink::PointerData::DeviceKind::kGesture; + case kSignal: + return blink::PointerData::DeviceKind::kSignal; } return blink::PointerData::DeviceKind::kMouse; } @@ -575,15 +575,15 @@ inline blink::PointerData::Change ToPointerDataChange( return blink::PointerData::Change::kCancel; } -// Returns the blink::PointerData::GestureKind for the given -// FlutterPointerGestureKind. -inline blink::PointerData::GestureKind ToPointerDataGestureKind( - FlutterPointerGestureKind kind) { +// Returns the blink::PointerData::SignalKind for the given +// FlutterPointerSignaKind. +inline blink::PointerData::SignalKind ToPointerDataSignalKind( + FlutterPointerSignalKind kind) { switch (kind) { case kScroll: - return blink::PointerData::GestureKind::kScroll; + return blink::PointerData::SignalKind::kScroll; } - return blink::PointerData::GestureKind::kScroll; + return blink::PointerData::SignalKind::kScroll; } FlutterEngineResult FlutterEngineSendPointerEvent( @@ -609,8 +609,8 @@ FlutterEngineResult FlutterEngineSendPointerEvent( pointer_data.physical_y = SAFE_ACCESS(current, y, 0.0); pointer_data.kind = ToPointerDataDeviceKind( SAFE_ACCESS(current, kind, FlutterPointerDeviceKind::kMouse)); - pointer_data.gesture_kind = ToPointerDataGestureKind( - SAFE_ACCESS(current, gesture_kind, FlutterPointerGestureKind::kScroll)); + pointer_data.signal_kind = ToPointerDataSignalKind( + SAFE_ACCESS(current, signal_kind, FlutterPointerSignalKind::kScroll)); pointer_data.scroll_delta_x = SAFE_ACCESS(current, scroll_delta_x, 0.0); pointer_data.scroll_delta_y = SAFE_ACCESS(current, scroll_delta_y, 0.0); packet->SetPointerData(i, pointer_data); diff --git a/shell/platform/embedder/embedder.h b/shell/platform/embedder/embedder.h index b3b433aac3ae6..6275de6843213 100644 --- a/shell/platform/embedder/embedder.h +++ b/shell/platform/embedder/embedder.h @@ -146,7 +146,7 @@ typedef struct { // The kind of device generating a pointer event. typedef enum { kMouse, - kGesture, + kSignal, } FlutterPointerDeviceKind; // The phase of the pointer event. @@ -160,10 +160,10 @@ typedef enum { kHover, } FlutterPointerPhase; -// The type of a pointer gesture (e.g., trackpad event). +// The type of a pointer signal. typedef enum { kScroll, -} FlutterPointerGestureKind; +} FlutterPointerSignalKind; typedef struct { // The size of this struct. Must be sizeof(FlutterPointerEvent). @@ -173,7 +173,7 @@ typedef struct { double x; double y; FlutterPointerDeviceKind kind; - FlutterPointerGestureKind gesture_kind; // ignored unless kind is kGesture. + FlutterPointerSignalKind signal_kind; // ignored unless kind is kSignal. double scroll_delta_x; double scroll_delta_y; } FlutterPointerEvent; From 2628378b654777306100d2d4e5254a6a97e5ad19 Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Wed, 13 Feb 2019 11:19:09 -0800 Subject: [PATCH 5/6] Remove the use of signal as a kind --- lib/ui/pointer.dart | 11 ++++----- lib/ui/window/pointer_data.h | 1 + .../android/io/flutter/view/FlutterView.java | 8 +++---- shell/platform/embedder/embedder.cc | 23 ++++--------------- shell/platform/embedder/embedder.h | 12 +++------- 5 files changed, 18 insertions(+), 37 deletions(-) diff --git a/lib/ui/pointer.dart b/lib/ui/pointer.dart index 232d1018548bd..fd5f3a13e25aa 100644 --- a/lib/ui/pointer.dart +++ b/lib/ui/pointer.dart @@ -50,16 +50,15 @@ enum PointerDeviceKind { /// A pointer device with a stylus that has been inverted. invertedStylus, - /// A pointer that is generating signals at its location. Examples include - /// a mouse scroll wheel, or trackpad gestures such as scroll and pinch. - signal, - /// An unknown pointer device. unknown } /// The kind of [PointerDeviceKind.signal]. enum PointerSignalKind { + /// The event is not associated with a pointer signal. + none, + /// A pointer-generated scroll (e.g., mouse wheel or trackpad scroll). scroll, @@ -222,12 +221,12 @@ class PointerData { /// Opaque platform-specific data associated with the event. final int platformData; - /// For PointerDeviceKind.signal with PointerSignalKind.scroll: + /// For events with signalKind of PointerSignalKind.scroll: /// /// The amount to scroll in the x direction, in physical pixels. final double scrollDeltaX; - /// For PointerDeviceKind.signal with PointerSignalKind.scroll: + /// For events with signalKind of PointerSignalKind.scroll: /// /// The amount to scroll in the y direction, in physical pixels. final double scrollDeltaY; diff --git a/lib/ui/window/pointer_data.h b/lib/ui/window/pointer_data.h index a1d68fdfa6af6..56fd6067a1b35 100644 --- a/lib/ui/window/pointer_data.h +++ b/lib/ui/window/pointer_data.h @@ -33,6 +33,7 @@ struct alignas(8) PointerData { // Must match the PointerSignalKind enum in pointer.dart. enum class SignalKind : int64_t { + kNone, kScroll, }; diff --git a/shell/platform/android/io/flutter/view/FlutterView.java b/shell/platform/android/io/flutter/view/FlutterView.java index 98f99b669be0b..17940e3e946ec 100644 --- a/shell/platform/android/io/flutter/view/FlutterView.java +++ b/shell/platform/android/io/flutter/view/FlutterView.java @@ -399,8 +399,9 @@ public InputConnection onCreateInputConnection(EditorInfo outAttrs) { private static final int kPointerDeviceKindUnknown = 5; // Must match the PointerSignalKind enum in pointer.dart. - private static final int kPointerSignalKindScroll = 0; - private static final int kPointerSignalKindUnknown = 1; + private static final int kPointerSignalKindNone = 0; + private static final int kPointerSignalKindScroll = 1; + private static final int kPointerSignalKindUnknown = 2; // These values must match the unpacking code in hooks.dart. private static final int kPointerDataFieldCount = 24; @@ -458,8 +459,7 @@ private void addPointerForIndex(MotionEvent event, int pointerIndex, int pointer int pointerKind = getPointerDeviceTypeForToolType(event.getToolType(pointerIndex)); - // This is ignored for non-signal device kinds. - int signalKind = kPointerSignalKindScroll; + int signalKind = kPointerSignalKindNone; long timeStamp = event.getEventTime() * 1000; // Convert from milliseconds to microseconds. diff --git a/shell/platform/embedder/embedder.cc b/shell/platform/embedder/embedder.cc index e2e68e6c91220..05a26b9ca5548 100644 --- a/shell/platform/embedder/embedder.cc +++ b/shell/platform/embedder/embedder.cc @@ -540,19 +540,6 @@ FlutterEngineResult FlutterEngineSendWindowMetricsEvent( : kInvalidArguments; } -// Returns the blink::PointerData::DeviceKind for the given -// FlutterPointerDeviceKind. -inline blink::PointerData::DeviceKind ToPointerDataDeviceKind( - FlutterPointerDeviceKind kind) { - switch (kind) { - case kMouse: - return blink::PointerData::DeviceKind::kMouse; - case kSignal: - return blink::PointerData::DeviceKind::kSignal; - } - return blink::PointerData::DeviceKind::kMouse; -} - // Returns the blink::PointerData::Change for the given FlutterPointerPhase. inline blink::PointerData::Change ToPointerDataChange( FlutterPointerPhase phase) { @@ -580,10 +567,12 @@ inline blink::PointerData::Change ToPointerDataChange( inline blink::PointerData::SignalKind ToPointerDataSignalKind( FlutterPointerSignalKind kind) { switch (kind) { - case kScroll: + case kFlutterPointerSignalKindNone: + return blink::PointerData::SignalKind::kNone; + case kFlutterPointerSignalKindScroll: return blink::PointerData::SignalKind::kScroll; } - return blink::PointerData::SignalKind::kScroll; + return blink::PointerData::SignalKind::kNone; } FlutterEngineResult FlutterEngineSendPointerEvent( @@ -607,10 +596,8 @@ FlutterEngineResult FlutterEngineSendPointerEvent( pointer_data.kind = blink::PointerData::DeviceKind::kMouse; pointer_data.physical_x = SAFE_ACCESS(current, x, 0.0); pointer_data.physical_y = SAFE_ACCESS(current, y, 0.0); - pointer_data.kind = ToPointerDataDeviceKind( - SAFE_ACCESS(current, kind, FlutterPointerDeviceKind::kMouse)); pointer_data.signal_kind = ToPointerDataSignalKind( - SAFE_ACCESS(current, signal_kind, FlutterPointerSignalKind::kScroll)); + SAFE_ACCESS(current, signal_kind, kFlutterPointerSignalKindNone)); pointer_data.scroll_delta_x = SAFE_ACCESS(current, scroll_delta_x, 0.0); pointer_data.scroll_delta_y = SAFE_ACCESS(current, scroll_delta_y, 0.0); packet->SetPointerData(i, pointer_data); diff --git a/shell/platform/embedder/embedder.h b/shell/platform/embedder/embedder.h index 6275de6843213..0e2b8a502bff5 100644 --- a/shell/platform/embedder/embedder.h +++ b/shell/platform/embedder/embedder.h @@ -143,12 +143,6 @@ typedef struct { double pixel_ratio; } FlutterWindowMetricsEvent; -// The kind of device generating a pointer event. -typedef enum { - kMouse, - kSignal, -} FlutterPointerDeviceKind; - // The phase of the pointer event. typedef enum { kCancel, @@ -162,7 +156,8 @@ typedef enum { // The type of a pointer signal. typedef enum { - kScroll, + kFlutterPointerSignalKindNone, + kFlutterPointerSignalKindScroll, } FlutterPointerSignalKind; typedef struct { @@ -172,8 +167,7 @@ typedef struct { size_t timestamp; // in microseconds. double x; double y; - FlutterPointerDeviceKind kind; - FlutterPointerSignalKind signal_kind; // ignored unless kind is kSignal. + FlutterPointerSignalKind signal_kind; double scroll_delta_x; double scroll_delta_y; } FlutterPointerEvent; From edcbe4a424c2fc27b77f90fad307af26d20b94d3 Mon Sep 17 00:00:00 2001 From: Stuart Morgan Date: Tue, 26 Feb 2019 16:22:05 -0800 Subject: [PATCH 6/6] Update stub_ui --- lib/stub_ui/hooks.dart | 5 ++++- lib/stub_ui/pointer.dart | 33 ++++++++++++++++++++++++++++++++- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/lib/stub_ui/hooks.dart b/lib/stub_ui/hooks.dart index 8fd0c2a338a01..6e0820832939b 100644 --- a/lib/stub_ui/hooks.dart +++ b/lib/stub_ui/hooks.dart @@ -213,7 +213,7 @@ void _invoke3(void callback(A1 a1, A2 a2, A3 a3), Zone zone, A1 arg1 // // * pointer_data.cc // * FlutterView.java -const int _kPointerDataFieldCount = 21; +const int _kPointerDataFieldCount = 24; PointerDataPacket _unpackPointerDataPacket(ByteData packet) { const int kStride = Int64List.bytesPerElement; @@ -227,6 +227,7 @@ PointerDataPacket _unpackPointerDataPacket(ByteData packet) { timeStamp: new Duration(microseconds: packet.getInt64(kStride * offset++, _kFakeHostEndian)), change: PointerChange.values[packet.getInt64(kStride * offset++, _kFakeHostEndian)], kind: PointerDeviceKind.values[packet.getInt64(kStride * offset++, _kFakeHostEndian)], + signalKind: PointerSignalKind.values[packet.getInt64(kStride * offset++, _kFakeHostEndian)], device: packet.getInt64(kStride * offset++, _kFakeHostEndian), physicalX: packet.getFloat64(kStride * offset++, _kFakeHostEndian), physicalY: packet.getFloat64(kStride * offset++, _kFakeHostEndian), @@ -245,6 +246,8 @@ PointerDataPacket _unpackPointerDataPacket(ByteData packet) { orientation: packet.getFloat64(kStride * offset++, _kFakeHostEndian), tilt: packet.getFloat64(kStride * offset++, _kFakeHostEndian), platformData: packet.getInt64(kStride * offset++, _kFakeHostEndian), + scrollDeltaX: packet.getFloat64(kStride * offset++, _kFakeHostEndian), + scrollDeltaY: packet.getFloat64(kStride * offset++, _kFakeHostEndian) ); assert(offset == (i + 1) * _kPointerDataFieldCount); } diff --git a/lib/stub_ui/pointer.dart b/lib/stub_ui/pointer.dart index c0d3757d84bd5..fd5f3a13e25aa 100644 --- a/lib/stub_ui/pointer.dart +++ b/lib/stub_ui/pointer.dart @@ -54,6 +54,18 @@ enum PointerDeviceKind { unknown } +/// The kind of [PointerDeviceKind.signal]. +enum PointerSignalKind { + /// The event is not associated with a pointer signal. + none, + + /// A pointer-generated scroll (e.g., mouse wheel or trackpad scroll). + scroll, + + /// An unknown pointer signal kind. + unknown +} + /// Information about the state of a pointer. class PointerData { /// Creates an object that represents the state of a pointer. @@ -61,6 +73,7 @@ class PointerData { this.timeStamp: Duration.zero, this.change: PointerChange.cancel, this.kind: PointerDeviceKind.touch, + this.signalKind, this.device: 0, this.physicalX: 0.0, this.physicalY: 0.0, @@ -79,6 +92,8 @@ class PointerData { this.orientation: 0.0, this.tilt: 0.0, this.platformData: 0, + this.scrollDeltaX: 0.0, + this.scrollDeltaY: 0.0, }); /// Time of event dispatch, relative to an arbitrary timeline. @@ -90,6 +105,9 @@ class PointerData { /// The kind of input device for which the event was generated. final PointerDeviceKind kind; + /// The kind of signal for a pointer signal event. + final PointerSignalKind signalKind; + /// Unique identifier for the pointing device, reused across interactions. final int device; @@ -203,6 +221,16 @@ class PointerData { /// Opaque platform-specific data associated with the event. final int platformData; + /// For events with signalKind of PointerSignalKind.scroll: + /// + /// The amount to scroll in the x direction, in physical pixels. + final double scrollDeltaX; + + /// For events with signalKind of PointerSignalKind.scroll: + /// + /// The amount to scroll in the y direction, in physical pixels. + final double scrollDeltaY; + @override String toString() => '$runtimeType(x: $physicalX, y: $physicalY)'; @@ -212,6 +240,7 @@ class PointerData { 'timeStamp: $timeStamp, ' 'change: $change, ' 'kind: $kind, ' + 'signalKind: $signalKind, ' 'device: $device, ' 'physicalX: $physicalX, ' 'physicalY: $physicalY, ' @@ -228,7 +257,9 @@ class PointerData { 'radiusMax: $radiusMax, ' 'orientation: $orientation, ' 'tilt: $tilt, ' - 'platformData: $platformData' + 'platformData: $platformData, ' + 'scrollDeltaX: $scrollDeltaX, ' + 'scrollDeltaY: $scrollDeltaY' ')'; } }