Skip to content

Commit

Permalink
Address feedback
Browse files Browse the repository at this point in the history
  • Loading branch information
moffatman committed Apr 18, 2022
1 parent 8b150c1 commit 4ba1e68
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 2 deletions.
Expand Up @@ -591,6 +591,10 @@ - (void)dispatchGestureEvent:(nonnull NSEvent*)event {
[self dispatchMouseEvent:event phase:kPanZoomEnd];
} else if (event.phase == NSEventPhaseNone && event.momentumPhase == NSEventPhaseNone) {
[self dispatchMouseEvent:event phase:kHover];
} else {
// Skip momentum events, the framework will generate scroll momentum
NSAssert(event.momentumPhase != NSEventPhaseNone,
@"Received gesture event with unexpected phase");
}
}

Expand Down
Expand Up @@ -558,6 +558,7 @@ - (bool)testTrackpadGesturesAreSentToFramework {
called = false;
[viewController scrollWheel:[NSEvent eventWithCGEvent:cgEventStart]];
EXPECT_TRUE(called);
EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
EXPECT_EQ(last_event.phase, kPanZoomStart);
EXPECT_EQ(last_event.device_kind, kFlutterPointerDeviceKindTrackpad);
EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
Expand All @@ -571,6 +572,7 @@ - (bool)testTrackpadGesturesAreSentToFramework {
called = false;
[viewController scrollWheel:[NSEvent eventWithCGEvent:cgEventUpdate]];
EXPECT_TRUE(called);
EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
EXPECT_EQ(last_event.phase, kPanZoomUpdate);
EXPECT_EQ(last_event.device_kind, kFlutterPointerDeviceKindTrackpad);
EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
Expand All @@ -581,6 +583,7 @@ - (bool)testTrackpadGesturesAreSentToFramework {
called = false;
[viewController scrollWheel:[NSEvent eventWithCGEvent:cgEventUpdate]];
EXPECT_TRUE(called);
EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
EXPECT_EQ(last_event.phase, kPanZoomUpdate);
EXPECT_EQ(last_event.device_kind, kFlutterPointerDeviceKindTrackpad);
EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
Expand All @@ -590,15 +593,56 @@ - (bool)testTrackpadGesturesAreSentToFramework {
// End gesture.
CGEventRef cgEventEnd = CGEventCreateCopy(cgEventStart);
CGEventSetIntegerValueField(cgEventEnd, kCGScrollWheelEventScrollPhase, kCGScrollPhaseEnded);
NSEvent* eventEnd = [NSEvent eventWithCGEvent:cgEventEnd];

called = false;
[viewController scrollWheel:eventEnd];
[viewController scrollWheel:[NSEvent eventWithCGEvent:cgEventEnd]];
EXPECT_TRUE(called);
EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
EXPECT_EQ(last_event.phase, kPanZoomEnd);
EXPECT_EQ(last_event.device_kind, kFlutterPointerDeviceKindTrackpad);
EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);

// May-begin and cancel are used while macOS determines which type of gesture to choose
CGEventRef cgEventMayBegin = CGEventCreateCopy(cgEventStart);
CGEventSetIntegerValueField(cgEventMayBegin, kCGScrollWheelEventScrollPhase,
kCGScrollPhaseMayBegin);

called = false;
[viewController scrollWheel:[NSEvent eventWithCGEvent:cgEventMayBegin]];
EXPECT_TRUE(called);
EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
EXPECT_EQ(last_event.phase, kPanZoomStart);
EXPECT_EQ(last_event.device_kind, kFlutterPointerDeviceKindTrackpad);
EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);

// Cancel gesture.
CGEventRef cgEventCancel = CGEventCreateCopy(cgEventStart);
CGEventSetIntegerValueField(cgEventCancel, kCGScrollWheelEventScrollPhase,
kCGScrollPhaseCancelled);

called = false;
[viewController scrollWheel:[NSEvent eventWithCGEvent:cgEventCancel]];
EXPECT_TRUE(called);
EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);
EXPECT_EQ(last_event.phase, kPanZoomEnd);
EXPECT_EQ(last_event.device_kind, kFlutterPointerDeviceKindTrackpad);
EXPECT_EQ(last_event.signal_kind, kFlutterPointerSignalKindNone);

// A discrete scroll event should use the PointerSignal system.
CGEventRef cgEventDiscrete = CGEventCreateScrollWheelEvent(NULL, 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 and direction is reversed.
EXPECT_EQ(last_event.scroll_delta_x, -40 * viewController.flutterView.layer.contentsScale);
EXPECT_EQ(last_event.scroll_delta_y, -80 * viewController.flutterView.layer.contentsScale);

return true;
}

Expand Down

0 comments on commit 4ba1e68

Please sign in to comment.