From a81a75b4aee3484832a3cbf9b4709a701b6c01f9 Mon Sep 17 00:00:00 2001 From: Kate Lovett Date: Thu, 15 Dec 2022 16:24:11 -0600 Subject: [PATCH 1/9] Undo axes flipping when using scroll wheel with shift key --- .../framework/Source/FlutterViewController.mm | 19 +++++++++++++++-- .../Source/FlutterViewControllerTest.mm | 21 +++++++++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/shell/platform/darwin/macos/framework/Source/FlutterViewController.mm b/shell/platform/darwin/macos/framework/Source/FlutterViewController.mm index 995b75e9011b8..407c6b4d27ca8 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterViewController.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterViewController.mm @@ -643,8 +643,23 @@ - (void)dispatchMouseEvent:(NSEvent*)event phase:(FlutterPointerPhase)phase { pixelsPerLine = 40.0; } double scaleFactor = self.flutterView.layer.contentsScale; - flutterEvent.scroll_delta_x = -event.scrollingDeltaX * pixelsPerLine * scaleFactor; - flutterEvent.scroll_delta_y = -event.scrollingDeltaY * pixelsPerLine * scaleFactor; + // When mouse input is received while shift is pressed (regardless of + // any other pressed keys), Mac automatically flips the axis. Other + // platforms do not do this, so we flip it back to normalize the input + // received by the framework. The keyboard+mouse-scroll mechanism is exposed + // in the ScrollBehavior of the framework so developers can customize the + // behavior. + // At time of change, Apple does not expose any other type of API or signal + // that they X/Y axes have been flipped. + if (event.modifierFlags & NSShiftKeyMask) { + flutterEvent.scroll_delta_x = -event.scrollingDeltaY; + flutterEvent.scroll_delta_y = -event.scrollingDeltaX; + } else { + flutterEvent.scroll_delta_x = -event.scrollingDeltaX; + flutterEvent.scroll_delta_y = -event.scrollingDeltaY; + } + flutterEvent.scroll_delta_x = flutterEvent.scroll_delta_x * pixelsPerLine * scaleFactor; + flutterEvent.scroll_delta_y = flutterEvent.scroll_delta_y * pixelsPerLine * scaleFactor; } [_engine sendPointerEvent:flutterEvent]; diff --git a/shell/platform/darwin/macos/framework/Source/FlutterViewControllerTest.mm b/shell/platform/darwin/macos/framework/Source/FlutterViewControllerTest.mm index bc7c18739043b..8a1229abb63f4 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterViewControllerTest.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterViewControllerTest.mm @@ -629,6 +629,27 @@ - (bool)testTrackpadGesturesAreSentToFramework { EXPECT_EQ(last_event.scroll_delta_x, -40 * viewController.flutterView.layer.contentsScale); EXPECT_EQ(last_event.scroll_delta_y, -80 * viewController.flutterView.layer.contentsScale); + // A discrete scroll event should use the PointerSignal system, and flip the + // direction when shift is pressed. + CGEventRef cgEventDiscrete = CGEventCreateScrollWheelEvent( + CGEventCreateKeyboardEvent(NULL, 56, TRUE), // SHIFT + kCGScrollEventUnitPixel, + 1, + 0, + ); + CGEventSetType(cgEventDiscrete, kCGEventScrollWheel); + CGEventSetIntegerValueField(cgEventDiscrete, kCGScrollWheelEventIsContinuous, 0); + CGEventSetIntegerValueField(cgEventDiscrete, kCGScrollWheelEventDeltaAxis2, 1); // scroll_delta_x + CGEventSetIntegerValueField(cgEventDiscrete, kCGScrollWheelEventDeltaAxis1, 2); // scroll_delta_y + + called = false; + [viewController scrollWheel:[NSEvent eventWithCGEvent:cgEventDiscrete]]; + EXPECT_TRUE(called); + EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindScroll); + // pixelsPerLine is 40.0, direction is reversed and axes have been flipped. + EXPECT_EQ(last_event.scroll_delta_x, -80 * viewController.flutterView.layer.contentsScale); + EXPECT_EQ(last_event.scroll_delta_y, -40 * viewController.flutterView.layer.contentsScale); + // Test for scale events. // Start gesture. called = false; From 458301400bf10d80df64e9db0259de5446d5589b Mon Sep 17 00:00:00 2001 From: Kate Lovett Date: Thu, 15 Dec 2022 16:27:25 -0600 Subject: [PATCH 2/9] Formatting --- .../Source/FlutterViewControllerTest.mm | 9 ++-- sky/packages/sky_engine/lib/_embedder.yaml | 42 +++++++++---------- 2 files changed, 24 insertions(+), 27 deletions(-) diff --git a/shell/platform/darwin/macos/framework/Source/FlutterViewControllerTest.mm b/shell/platform/darwin/macos/framework/Source/FlutterViewControllerTest.mm index 8a1229abb63f4..b54162cb31799 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterViewControllerTest.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterViewControllerTest.mm @@ -631,12 +631,9 @@ - (bool)testTrackpadGesturesAreSentToFramework { // A discrete scroll event should use the PointerSignal system, and flip the // direction when shift is pressed. - CGEventRef cgEventDiscrete = CGEventCreateScrollWheelEvent( - CGEventCreateKeyboardEvent(NULL, 56, TRUE), // SHIFT - kCGScrollEventUnitPixel, - 1, - 0, - ); + CGEventRef cgEventDiscrete = + CGEventCreateScrollWheelEvent(CGEventCreateKeyboardEvent(NULL, 56, TRUE), // SHIFT + kCGScrollEventUnitPixel, 1, 0); CGEventSetType(cgEventDiscrete, kCGEventScrollWheel); CGEventSetIntegerValueField(cgEventDiscrete, kCGScrollWheelEventIsContinuous, 0); CGEventSetIntegerValueField(cgEventDiscrete, kCGScrollWheelEventDeltaAxis2, 1); // scroll_delta_x diff --git a/sky/packages/sky_engine/lib/_embedder.yaml b/sky/packages/sky_engine/lib/_embedder.yaml index d14230709a8a7..ea718d65cd81f 100644 --- a/sky/packages/sky_engine/lib/_embedder.yaml +++ b/sky/packages/sky_engine/lib/_embedder.yaml @@ -1,27 +1,27 @@ -# This file is suitable for use within the tree. A different _embedder.yaml -# is generated by the BUILD.gn in this directory. Changes here must be -# mirrored there. +# This file is generated by //flutter/sky/packages/sky_engine:_embedder_yaml +# Do not modify this file directly. Instead, update the build file. + embedded_libs: - "dart:async": "../../../../../third_party/dart/sdk/lib/async/async.dart" - "dart:collection": "../../../../../third_party/dart/sdk/lib/collection/collection.dart" - "dart:convert": "../../../../../third_party/dart/sdk/lib/convert/convert.dart" - "dart:core": "../../../../../third_party/dart/sdk/lib/core/core.dart" - "dart:developer": "../../../../../third_party/dart/sdk/lib/developer/developer.dart" - "dart:ffi": "../../../../../third_party/dart/sdk/lib/ffi/ffi.dart" - "dart:html": "../../../../../third_party/dart/sdk/lib/html/html_dart2js.dart" - "dart:io": "../../../../../third_party/dart/sdk/lib/io/io.dart" - "dart:isolate": "../../../../../third_party/dart/sdk/lib/isolate/isolate.dart" - "dart:js": "../../../../../third_party/dart/sdk/lib/js/js.dart" - "dart:js_util": "../../../../../third_party/dart/sdk/lib/js_util/js_util.dart" - "dart:math": "../../../../../third_party/dart/sdk/lib/math/math.dart" - "dart:typed_data": "../../../../../third_party/dart/sdk/lib/typed_data/typed_data.dart" - "dart:ui": "../../../../lib/ui/ui.dart" - "dart:wasm": "../../../../../third_party/dart/sdk/lib/wasm/wasm_types.dart" + "dart:async": "async/async.dart" + "dart:collection": "collection/collection.dart" + "dart:convert": "convert/convert.dart" + "dart:core": "core/core.dart" + "dart:developer": "developer/developer.dart" + "dart:ffi": "ffi/ffi.dart" + "dart:html": "html/html_dart2js.dart" + "dart:io": "io/io.dart" + "dart:isolate": "isolate/isolate.dart" + "dart:js": "js/js.dart" + "dart:js_util": "js_util/js_util.dart" + "dart:math": "math/math.dart" + "dart:typed_data": "typed_data/typed_data.dart" + "dart:ui": "ui/ui.dart" + "dart:wasm": "wasm/wasm_types.dart" - "dart:_http": "../../../../../third_party/dart/sdk/lib/_http/http.dart" - "dart:_interceptors": "../../../../../third_party/dart/sdk/lib/_interceptors/interceptors.dart" + "dart:_http": "_http/http.dart" + "dart:_interceptors": "_interceptors/interceptors.dart" # The _internal library is needed as some implementations bleed into the # public API, e.g. List being Iterable by virtue of implementing # EfficientLengthIterable. Not including this library yields analysis errors. - "dart:_internal": "../../../../../third_party/dart/sdk/lib/internal/internal.dart" + "dart:_internal": "internal/internal.dart" "dart:nativewrappers": "_empty.dart" From 3865b0fc824e6885dcc25a904120cb6861d7ff95 Mon Sep 17 00:00:00 2001 From: Kate Lovett Date: Thu, 15 Dec 2022 16:31:46 -0600 Subject: [PATCH 3/9] ++ --- sky/packages/sky_engine/lib/_embedder.yaml | 42 +++++++++++----------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/sky/packages/sky_engine/lib/_embedder.yaml b/sky/packages/sky_engine/lib/_embedder.yaml index ea718d65cd81f..d14230709a8a7 100644 --- a/sky/packages/sky_engine/lib/_embedder.yaml +++ b/sky/packages/sky_engine/lib/_embedder.yaml @@ -1,27 +1,27 @@ -# This file is generated by //flutter/sky/packages/sky_engine:_embedder_yaml -# Do not modify this file directly. Instead, update the build file. - +# This file is suitable for use within the tree. A different _embedder.yaml +# is generated by the BUILD.gn in this directory. Changes here must be +# mirrored there. embedded_libs: - "dart:async": "async/async.dart" - "dart:collection": "collection/collection.dart" - "dart:convert": "convert/convert.dart" - "dart:core": "core/core.dart" - "dart:developer": "developer/developer.dart" - "dart:ffi": "ffi/ffi.dart" - "dart:html": "html/html_dart2js.dart" - "dart:io": "io/io.dart" - "dart:isolate": "isolate/isolate.dart" - "dart:js": "js/js.dart" - "dart:js_util": "js_util/js_util.dart" - "dart:math": "math/math.dart" - "dart:typed_data": "typed_data/typed_data.dart" - "dart:ui": "ui/ui.dart" - "dart:wasm": "wasm/wasm_types.dart" + "dart:async": "../../../../../third_party/dart/sdk/lib/async/async.dart" + "dart:collection": "../../../../../third_party/dart/sdk/lib/collection/collection.dart" + "dart:convert": "../../../../../third_party/dart/sdk/lib/convert/convert.dart" + "dart:core": "../../../../../third_party/dart/sdk/lib/core/core.dart" + "dart:developer": "../../../../../third_party/dart/sdk/lib/developer/developer.dart" + "dart:ffi": "../../../../../third_party/dart/sdk/lib/ffi/ffi.dart" + "dart:html": "../../../../../third_party/dart/sdk/lib/html/html_dart2js.dart" + "dart:io": "../../../../../third_party/dart/sdk/lib/io/io.dart" + "dart:isolate": "../../../../../third_party/dart/sdk/lib/isolate/isolate.dart" + "dart:js": "../../../../../third_party/dart/sdk/lib/js/js.dart" + "dart:js_util": "../../../../../third_party/dart/sdk/lib/js_util/js_util.dart" + "dart:math": "../../../../../third_party/dart/sdk/lib/math/math.dart" + "dart:typed_data": "../../../../../third_party/dart/sdk/lib/typed_data/typed_data.dart" + "dart:ui": "../../../../lib/ui/ui.dart" + "dart:wasm": "../../../../../third_party/dart/sdk/lib/wasm/wasm_types.dart" - "dart:_http": "_http/http.dart" - "dart:_interceptors": "_interceptors/interceptors.dart" + "dart:_http": "../../../../../third_party/dart/sdk/lib/_http/http.dart" + "dart:_interceptors": "../../../../../third_party/dart/sdk/lib/_interceptors/interceptors.dart" # The _internal library is needed as some implementations bleed into the # public API, e.g. List being Iterable by virtue of implementing # EfficientLengthIterable. Not including this library yields analysis errors. - "dart:_internal": "internal/internal.dart" + "dart:_internal": "../../../../../third_party/dart/sdk/lib/internal/internal.dart" "dart:nativewrappers": "_empty.dart" From eaf84c77fac0c863a549f4e791ad7d336121d2cc Mon Sep 17 00:00:00 2001 From: Kate Lovett Date: Thu, 15 Dec 2022 17:13:11 -0600 Subject: [PATCH 4/9] Fix test --- .../Source/FlutterViewControllerTest.mm | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/shell/platform/darwin/macos/framework/Source/FlutterViewControllerTest.mm b/shell/platform/darwin/macos/framework/Source/FlutterViewControllerTest.mm index b54162cb31799..027420a8ac752 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterViewControllerTest.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterViewControllerTest.mm @@ -631,16 +631,18 @@ - (bool)testTrackpadGesturesAreSentToFramework { // A discrete scroll event should use the PointerSignal system, and flip the // direction when shift is pressed. - CGEventRef cgEventDiscrete = - CGEventCreateScrollWheelEvent(CGEventCreateKeyboardEvent(NULL, 56, TRUE), // SHIFT - kCGScrollEventUnitPixel, 1, 0); - CGEventSetType(cgEventDiscrete, kCGEventScrollWheel); - CGEventSetIntegerValueField(cgEventDiscrete, kCGScrollWheelEventIsContinuous, 0); - CGEventSetIntegerValueField(cgEventDiscrete, kCGScrollWheelEventDeltaAxis2, 1); // scroll_delta_x - CGEventSetIntegerValueField(cgEventDiscrete, kCGScrollWheelEventDeltaAxis1, 2); // scroll_delta_y + CGEventRef cgEventDiscreteShift = + CGEventCreateScrollWheelEvent(NULL, kCGScrollEventUnitPixel, 1, 0); + CGEventSetType(cgEventDiscreteShift, kCGEventScrollWheel); + CGEventSetFlags(cgEventDiscreteShift, kCGEventFlagMaskShift); + CGEventSetIntegerValueField(cgEventDiscreteShift, kCGScrollWheelEventIsContinuous, 0); + CGEventSetIntegerValueField(cgEventDiscreteShift, kCGScrollWheelEventDeltaAxis2, + 1); // scroll_delta_x + CGEventSetIntegerValueField(cgEventDiscreteShift, kCGScrollWheelEventDeltaAxis1, + 2); // scroll_delta_y called = false; - [viewController scrollWheel:[NSEvent eventWithCGEvent:cgEventDiscrete]]; + [viewController scrollWheel:[NSEvent eventWithCGEvent:cgEventDiscreteShift]]; EXPECT_TRUE(called); EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindScroll); // pixelsPerLine is 40.0, direction is reversed and axes have been flipped. From 3856300dff2989a2398b92b1891b85047e5b3162 Mon Sep 17 00:00:00 2001 From: Kate Lovett Date: Fri, 16 Dec 2022 16:55:19 -0600 Subject: [PATCH 5/9] Fix for test --- .../macos/framework/Source/FlutterViewController.mm | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/shell/platform/darwin/macos/framework/Source/FlutterViewController.mm b/shell/platform/darwin/macos/framework/Source/FlutterViewController.mm index 407c6b4d27ca8..bc37bb193b7f4 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterViewController.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterViewController.mm @@ -652,14 +652,12 @@ - (void)dispatchMouseEvent:(NSEvent*)event phase:(FlutterPointerPhase)phase { // At time of change, Apple does not expose any other type of API or signal // that they X/Y axes have been flipped. if (event.modifierFlags & NSShiftKeyMask) { - flutterEvent.scroll_delta_x = -event.scrollingDeltaY; - flutterEvent.scroll_delta_y = -event.scrollingDeltaX; + flutterEvent.scroll_delta_x = -event.scrollingDeltaY * pixelsPerLine * scaleFactor; + flutterEvent.scroll_delta_y = -event.scrollingDeltaX * pixelsPerLine * scaleFactor; } else { - flutterEvent.scroll_delta_x = -event.scrollingDeltaX; - flutterEvent.scroll_delta_y = -event.scrollingDeltaY; + flutterEvent.scroll_delta_x = -event.scrollingDeltaX * pixelsPerLine * scaleFactor; + flutterEvent.scroll_delta_y = -event.scrollingDeltaY * pixelsPerLine * scaleFactor; } - flutterEvent.scroll_delta_x = flutterEvent.scroll_delta_x * pixelsPerLine * scaleFactor; - flutterEvent.scroll_delta_y = flutterEvent.scroll_delta_y * pixelsPerLine * scaleFactor; } [_engine sendPointerEvent:flutterEvent]; From d3354a7efe802809f8148405589ccc0e4fcbaaa0 Mon Sep 17 00:00:00 2001 From: Kate Lovett Date: Mon, 19 Dec 2022 16:27:31 -0600 Subject: [PATCH 6/9] Update shell/platform/darwin/macos/framework/Source/FlutterViewControllerTest.mm --- .../darwin/macos/framework/Source/FlutterViewControllerTest.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shell/platform/darwin/macos/framework/Source/FlutterViewControllerTest.mm b/shell/platform/darwin/macos/framework/Source/FlutterViewControllerTest.mm index 027420a8ac752..51f341df620ed 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterViewControllerTest.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterViewControllerTest.mm @@ -634,7 +634,7 @@ - (bool)testTrackpadGesturesAreSentToFramework { CGEventRef cgEventDiscreteShift = CGEventCreateScrollWheelEvent(NULL, kCGScrollEventUnitPixel, 1, 0); CGEventSetType(cgEventDiscreteShift, kCGEventScrollWheel); - CGEventSetFlags(cgEventDiscreteShift, kCGEventFlagMaskShift); + // CGEventSetFlags(cgEventDiscreteShift, kCGEventFlagMaskShift); CGEventSetIntegerValueField(cgEventDiscreteShift, kCGScrollWheelEventIsContinuous, 0); CGEventSetIntegerValueField(cgEventDiscreteShift, kCGScrollWheelEventDeltaAxis2, 1); // scroll_delta_x From 64f22d9e156e68a3f9275d62570303028d067c10 Mon Sep 17 00:00:00 2001 From: Kate Lovett Date: Mon, 19 Dec 2022 17:50:10 -0600 Subject: [PATCH 7/9] ++ --- .../framework/Source/FlutterViewControllerTest.mm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/shell/platform/darwin/macos/framework/Source/FlutterViewControllerTest.mm b/shell/platform/darwin/macos/framework/Source/FlutterViewControllerTest.mm index 51f341df620ed..bab61e59e2e15 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterViewControllerTest.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterViewControllerTest.mm @@ -634,10 +634,10 @@ - (bool)testTrackpadGesturesAreSentToFramework { CGEventRef cgEventDiscreteShift = CGEventCreateScrollWheelEvent(NULL, kCGScrollEventUnitPixel, 1, 0); CGEventSetType(cgEventDiscreteShift, kCGEventScrollWheel); - // CGEventSetFlags(cgEventDiscreteShift, kCGEventFlagMaskShift); + CGEventSetFlags(cgEventDiscreteShift, kCGEventFlagMaskShift); CGEventSetIntegerValueField(cgEventDiscreteShift, kCGScrollWheelEventIsContinuous, 0); CGEventSetIntegerValueField(cgEventDiscreteShift, kCGScrollWheelEventDeltaAxis2, - 1); // scroll_delta_x + 0); // scroll_delta_x CGEventSetIntegerValueField(cgEventDiscreteShift, kCGScrollWheelEventDeltaAxis1, 2); // scroll_delta_y @@ -645,9 +645,9 @@ - (bool)testTrackpadGesturesAreSentToFramework { [viewController scrollWheel:[NSEvent eventWithCGEvent:cgEventDiscreteShift]]; EXPECT_TRUE(called); EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindScroll); - // pixelsPerLine is 40.0, direction is reversed and axes have been flipped. - EXPECT_EQ(last_event.scroll_delta_x, -80 * viewController.flutterView.layer.contentsScale); - EXPECT_EQ(last_event.scroll_delta_y, -40 * viewController.flutterView.layer.contentsScale); + // pixelsPerLine is 40.0, direction is reversed and axes have been flipped back. + EXPECT_FLOAT_EQ(last_event.scroll_delta_x, 0.0 * viewController.flutterView.layer.contentsScale); + EXPECT_FLOAT_EQ(last_event.scroll_delta_y, -80.0 * viewController.flutterView.layer.contentsScale); // Test for scale events. // Start gesture. From 6e8f3fddf36a81e80358ed64fb81f0e97f0273c0 Mon Sep 17 00:00:00 2001 From: Kate Lovett Date: Thu, 22 Dec 2022 16:37:21 -0600 Subject: [PATCH 8/9] Fix format --- .../darwin/macos/framework/Source/FlutterViewControllerTest.mm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/shell/platform/darwin/macos/framework/Source/FlutterViewControllerTest.mm b/shell/platform/darwin/macos/framework/Source/FlutterViewControllerTest.mm index bab61e59e2e15..903065731a31a 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterViewControllerTest.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterViewControllerTest.mm @@ -647,7 +647,8 @@ - (bool)testTrackpadGesturesAreSentToFramework { EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindScroll); // pixelsPerLine is 40.0, direction is reversed and axes have been flipped back. EXPECT_FLOAT_EQ(last_event.scroll_delta_x, 0.0 * viewController.flutterView.layer.contentsScale); - EXPECT_FLOAT_EQ(last_event.scroll_delta_y, -80.0 * viewController.flutterView.layer.contentsScale); + EXPECT_FLOAT_EQ(last_event.scroll_delta_y, + -80.0 * viewController.flutterView.layer.contentsScale); // Test for scale events. // Start gesture. From 7dfa411e463fde76d6869847f05c4cf64948b7dc Mon Sep 17 00:00:00 2001 From: Kate Lovett Date: Mon, 9 Jan 2023 17:37:50 -0600 Subject: [PATCH 9/9] Review feedback --- .../macos/framework/Source/FlutterViewController.mm | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/shell/platform/darwin/macos/framework/Source/FlutterViewController.mm b/shell/platform/darwin/macos/framework/Source/FlutterViewController.mm index bc37bb193b7f4..9034e8deaa6c1 100644 --- a/shell/platform/darwin/macos/framework/Source/FlutterViewController.mm +++ b/shell/platform/darwin/macos/framework/Source/FlutterViewController.mm @@ -650,13 +650,15 @@ - (void)dispatchMouseEvent:(NSEvent*)event phase:(FlutterPointerPhase)phase { // in the ScrollBehavior of the framework so developers can customize the // behavior. // At time of change, Apple does not expose any other type of API or signal - // that they X/Y axes have been flipped. + // that the X/Y axes have been flipped. + double scaledDeltaX = -event.scrollingDeltaX * pixelsPerLine * scaleFactor; + double scaledDeltaY = -event.scrollingDeltaY * pixelsPerLine * scaleFactor; if (event.modifierFlags & NSShiftKeyMask) { - flutterEvent.scroll_delta_x = -event.scrollingDeltaY * pixelsPerLine * scaleFactor; - flutterEvent.scroll_delta_y = -event.scrollingDeltaX * pixelsPerLine * scaleFactor; + flutterEvent.scroll_delta_x = scaledDeltaY; + flutterEvent.scroll_delta_y = scaledDeltaX; } else { - flutterEvent.scroll_delta_x = -event.scrollingDeltaX * pixelsPerLine * scaleFactor; - flutterEvent.scroll_delta_y = -event.scrollingDeltaY * pixelsPerLine * scaleFactor; + flutterEvent.scroll_delta_x = scaledDeltaX; + flutterEvent.scroll_delta_y = scaledDeltaY; } } [_engine sendPointerEvent:flutterEvent];