93
93
bool rotate_gesture_active = false ;
94
94
95
95
/* *
96
- * System scroll inertia is currently sending us events .
96
+ * Time of last scroll momentum event .
97
97
*/
98
- bool system_scroll_inertia_active = false ;
98
+ NSTimeInterval last_scroll_momentum_changed_time = 0 ;
99
99
100
100
/* *
101
101
* Resets all gesture state to default values.
@@ -520,11 +520,11 @@ - (void)dispatchGestureEvent:(nonnull NSEvent*)event {
520
520
} else if (event.phase == NSEventPhaseNone && event.momentumPhase == NSEventPhaseNone) {
521
521
[self dispatchMouseEvent: event phase: kHover ];
522
522
} else {
523
- if ( event. momentumPhase == NSEventPhaseBegan) {
524
- _mouseState. system_scroll_inertia_active = true ;
525
- } else if (event. momentumPhase == NSEventPhaseEnded ||
526
- event.momentumPhase == NSEventPhaseCancelled ) {
527
- _mouseState.system_scroll_inertia_active = false ;
523
+ // Waiting until the first momentum change event is a workaround for an issue where
524
+ // touchesBegan: is called unexpectedly while in low power mode within the interval between
525
+ // momentum start and the first momentum change.
526
+ if ( event.momentumPhase == NSEventPhaseChanged ) {
527
+ _mouseState.last_scroll_momentum_changed_time = event. timestamp ;
528
528
}
529
529
// Skip momentum update events, the framework will generate scroll momentum.
530
530
NSAssert (event.momentumPhase != NSEventPhaseNone,
@@ -548,6 +548,8 @@ - (void)dispatchMouseEvent:(NSEvent*)event phase:(FlutterPointerPhase)phase {
548
548
_mouseState.rotate_gesture_active ;
549
549
if (event.type == NSEventTypeScrollWheel) {
550
550
_mouseState.pan_gesture_active = true ;
551
+ // Ensure scroll inertia cancel event is not sent afterwards.
552
+ _mouseState.last_scroll_momentum_changed_time = 0 ;
551
553
} else if (event.type == NSEventTypeMagnify) {
552
554
_mouseState.scale_gesture_active = true ;
553
555
} else if (event.type == NSEventTypeRotate) {
@@ -840,8 +842,8 @@ - (void)swipeWithEvent:(NSEvent*)event {
840
842
- (void )touchesBeganWithEvent : (NSEvent *)event {
841
843
NSTouch * touch = event.allTouches .anyObject ;
842
844
if (touch != nil ) {
843
- if (_mouseState.system_scroll_inertia_active ) {
844
- // The trackpad has been touched and a scroll gesture is still sending inertia events .
845
+ if ((event. timestamp - _mouseState.last_scroll_momentum_changed_time ) < 0.010 ) {
846
+ // The trackpad has been touched within 10 ms following a scroll momentum event .
845
847
// A scroll inertia cancel message should be sent to the framework.
846
848
NSPoint locationInView = [self .flutterView convertPoint: event.locationInWindow fromView: nil ];
847
849
NSPoint locationInBackingCoordinates =
@@ -857,6 +859,8 @@ - (void)touchesBeganWithEvent:(NSEvent*)event {
857
859
};
858
860
859
861
[_engine sendPointerEvent: flutterEvent];
862
+ // Ensure no further scroll inertia cancel event will be sent.
863
+ _mouseState.last_scroll_momentum_changed_time = 0 ;
860
864
}
861
865
}
862
866
}
0 commit comments