Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 7e9a78c

Browse files
committed
[macOS] Handle inteleaved movement and scroll events
1 parent c81730e commit 7e9a78c

File tree

2 files changed

+40
-1
lines changed

2 files changed

+40
-1
lines changed

shell/platform/darwin/macos/framework/Source/FlutterViewController.mm

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,6 @@ void Reset() {
129129
flutter_state_is_down = false;
130130
has_pending_exit = false;
131131
buttons = 0;
132-
GestureReset();
133132
}
134133
};
135134

shell/platform/darwin/macos/framework/Source/FlutterViewControllerTest.mm

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ - (bool)testKeyEquivalentIsPassedToTextInputPlugin:(id)mockEngine;
101101
- (bool)testFlagsChangedEventsArePropagatedIfNotHandled:(id)mockEngine;
102102
- (bool)testKeyboardIsRestartedOnEngineRestart:(id)mockEngine;
103103
- (bool)testTrackpadGesturesAreSentToFramework:(id)mockEngine;
104+
- (bool)mouseAndGestureEventsAreHandledSeparately:(id)engineMock;
104105
- (bool)testMouseDownUpEventsSentToNextResponder:(id)mockEngine;
105106
- (bool)testModifierKeysAreSynthesizedOnMouseMove:(id)mockEngine;
106107
- (bool)testViewWillAppearCalledMultipleTimes:(id)mockEngine;
@@ -287,6 +288,12 @@ id MockGestureEvent(NSEventType type, NSEventPhase phase, double magnification,
287288
[[FlutterViewControllerTestObjC alloc] testTrackpadGesturesAreSentToFramework:mockEngine]);
288289
}
289290

291+
TEST_F(FlutterViewControllerMockEngineTest, TestmouseAndGestureEventsAreHandledSeparately) {
292+
id mockEngine = GetMockEngine();
293+
ASSERT_TRUE(
294+
[[FlutterViewControllerTestObjC alloc] mouseAndGestureEventsAreHandledSeparately:mockEngine]);
295+
}
296+
290297
TEST_F(FlutterViewControllerMockEngineTest, TestMouseDownUpEventsSentToNextResponder) {
291298
id mockEngine = GetMockEngine();
292299
ASSERT_TRUE(
@@ -1004,6 +1011,39 @@ - (bool)testTrackpadGesturesAreSentToFramework:(id)engineMock {
10041011
return true;
10051012
}
10061013

1014+
- (bool)mouseAndGestureEventsAreHandledSeparately:(id)engineMock {
1015+
FlutterViewController* viewController = [[FlutterViewController alloc] initWithEngine:engineMock
1016+
nibName:@""
1017+
bundle:nil];
1018+
[viewController loadView];
1019+
1020+
// Test for pan events.
1021+
// Start gesture.
1022+
CGEventRef cgEventStart = CGEventCreateScrollWheelEvent(NULL, kCGScrollEventUnitPixel, 1, 0);
1023+
CGEventSetType(cgEventStart, kCGEventScrollWheel);
1024+
CGEventSetIntegerValueField(cgEventStart, kCGScrollWheelEventScrollPhase, kCGScrollPhaseBegan);
1025+
CGEventSetIntegerValueField(cgEventStart, kCGScrollWheelEventIsContinuous, 1);
1026+
[viewController scrollWheel:[NSEvent eventWithCGEvent:cgEventStart]];
1027+
1028+
CGEventRef cgEventUpdate = CGEventCreateCopy(cgEventStart);
1029+
CGEventSetIntegerValueField(cgEventUpdate, kCGScrollWheelEventScrollPhase, kCGScrollPhaseChanged);
1030+
CGEventSetIntegerValueField(cgEventUpdate, kCGScrollWheelEventDeltaAxis2, 1); // pan_x
1031+
CGEventSetIntegerValueField(cgEventUpdate, kCGScrollWheelEventDeltaAxis1, 2); // pan_y
1032+
[viewController scrollWheel:[NSEvent eventWithCGEvent:cgEventUpdate]];
1033+
1034+
// Magic mouse can interleave mouse events with scroll events.
1035+
NSEvent* mouseEvent = flutter::testing::CreateMouseEvent(0x00);
1036+
[viewController mouseEntered:mouseEvent];
1037+
[viewController mouseExited:mouseEvent];
1038+
1039+
// End gesture.
1040+
CGEventRef cgEventEnd = CGEventCreateCopy(cgEventStart);
1041+
CGEventSetIntegerValueField(cgEventEnd, kCGScrollWheelEventScrollPhase, kCGScrollPhaseEnded);
1042+
[viewController scrollWheel:[NSEvent eventWithCGEvent:cgEventEnd]];
1043+
1044+
return true;
1045+
}
1046+
10071047
- (bool)testViewWillAppearCalledMultipleTimes:(id)engineMock {
10081048
FlutterViewController* viewController = [[FlutterViewController alloc] initWithEngine:engineMock
10091049
nibName:@""

0 commit comments

Comments
 (0)