Flutter Engine Uber Docs
Docs for the entire Flutter Engine repo.
 
Loading...
Searching...
No Matches
fl_pointer_manager_test.cc
Go to the documentation of this file.
1// Copyright 2013 The Flutter Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
8
10#include "gtest/gtest.h"
11
13
15 StartEngine();
16
17 std::vector<FlutterPointerEvent> pointer_events;
19 SendPointerEvent,
20 ([&pointer_events](auto engine, const FlutterPointerEvent* events,
21 size_t events_count) {
22 for (size_t i = 0; i < events_count; i++) {
23 pointer_events.push_back(events[i]);
24 }
25
26 return kSuccess;
27 }));
28
29 g_autoptr(FlPointerManager) manager = fl_pointer_manager_new(42, engine);
31 1.0, 2.0, 0, 0);
33 3.0, 4.0, 0, 0);
34
35 EXPECT_EQ(pointer_events.size(), 2u);
36
37 EXPECT_EQ(pointer_events[0].timestamp, 1234000u);
38 EXPECT_EQ(pointer_events[0].x, 1.0);
39 EXPECT_EQ(pointer_events[0].y, 2.0);
40 EXPECT_EQ(pointer_events[0].device_kind, kFlutterPointerDeviceKindMouse);
41 EXPECT_EQ(pointer_events[0].buttons, 0);
42 EXPECT_EQ(pointer_events[0].view_id, 42);
43
44 EXPECT_EQ(pointer_events[1].timestamp, 1235000u);
45 EXPECT_EQ(pointer_events[1].x, 3.0);
46 EXPECT_EQ(pointer_events[1].y, 4.0);
47 EXPECT_EQ(pointer_events[1].device_kind, kFlutterPointerDeviceKindMouse);
48 EXPECT_EQ(pointer_events[1].buttons, 0);
49 EXPECT_EQ(pointer_events[1].view_id, 42);
50}
51
53 StartEngine();
54
55 std::vector<FlutterPointerEvent> pointer_events;
57 SendPointerEvent,
58 ([&pointer_events](auto engine, const FlutterPointerEvent* events,
59 size_t events_count) {
60 for (size_t i = 0; i < events_count; i++) {
61 pointer_events.push_back(events[i]);
62 }
63
64 return kSuccess;
65 }));
66
67 g_autoptr(FlPointerManager) manager = fl_pointer_manager_new(42, engine);
69 1.0, 2.0, 0, 0);
70 // Duplicate enter is ignored
72 3.0, 4.0, 0, 0);
73
74 EXPECT_EQ(pointer_events.size(), 1u);
75
76 EXPECT_EQ(pointer_events[0].timestamp, 1234000u);
77 EXPECT_EQ(pointer_events[0].x, 1.0);
78 EXPECT_EQ(pointer_events[0].y, 2.0);
79 EXPECT_EQ(pointer_events[0].device_kind, kFlutterPointerDeviceKindMouse);
80 EXPECT_EQ(pointer_events[0].buttons, 0);
81 EXPECT_EQ(pointer_events[0].view_id, 42);
82}
83
84TEST_F(FlPointerManagerTest, EnterLeaveLeave) {
85 StartEngine();
86
87 std::vector<FlutterPointerEvent> pointer_events;
89 SendPointerEvent,
90 ([&pointer_events](auto engine, const FlutterPointerEvent* events,
91 size_t events_count) {
92 for (size_t i = 0; i < events_count; i++) {
93 pointer_events.push_back(events[i]);
94 }
95
96 return kSuccess;
97 }));
98
99 g_autoptr(FlPointerManager) manager = fl_pointer_manager_new(42, engine);
101 1.0, 2.0, 0, 0);
103 3.0, 4.0, 0, 0);
104 // Duplicate leave is ignored
106 5.0, 6.0, 0, 0);
107
108 EXPECT_EQ(pointer_events.size(), 2u);
109
110 EXPECT_EQ(pointer_events[0].timestamp, 1234000u);
111 EXPECT_EQ(pointer_events[0].x, 1.0);
112 EXPECT_EQ(pointer_events[0].y, 2.0);
113 EXPECT_EQ(pointer_events[0].device_kind, kFlutterPointerDeviceKindMouse);
114 EXPECT_EQ(pointer_events[0].buttons, 0);
115 EXPECT_EQ(pointer_events[0].view_id, 42);
116
117 EXPECT_EQ(pointer_events[1].timestamp, 1235000u);
118 EXPECT_EQ(pointer_events[1].x, 3.0);
119 EXPECT_EQ(pointer_events[1].y, 4.0);
120 EXPECT_EQ(pointer_events[1].device_kind, kFlutterPointerDeviceKindMouse);
121 EXPECT_EQ(pointer_events[1].buttons, 0);
122 EXPECT_EQ(pointer_events[1].view_id, 42);
123}
124
125TEST_F(FlPointerManagerTest, EnterButtonPress) {
126 StartEngine();
127
128 std::vector<FlutterPointerEvent> pointer_events;
130 SendPointerEvent,
131 ([&pointer_events](auto engine, const FlutterPointerEvent* events,
132 size_t events_count) {
133 for (size_t i = 0; i < events_count; i++) {
134 pointer_events.push_back(events[i]);
135 }
136
137 return kSuccess;
138 }));
139
140 g_autoptr(FlPointerManager) manager = fl_pointer_manager_new(42, engine);
142 1.0, 2.0, 0, 0);
145 8.0, GDK_BUTTON_PRIMARY, 0, 0);
146
147 EXPECT_EQ(pointer_events.size(), 2u);
148
149 EXPECT_EQ(pointer_events[0].timestamp, 1234000u);
150 EXPECT_EQ(pointer_events[0].x, 1.0);
151 EXPECT_EQ(pointer_events[0].y, 2.0);
152 EXPECT_EQ(pointer_events[0].device_kind, kFlutterPointerDeviceKindMouse);
153 EXPECT_EQ(pointer_events[0].buttons, 0);
154 EXPECT_EQ(pointer_events[0].view_id, 42);
155
156 EXPECT_EQ(pointer_events[1].timestamp, 1235000u);
157 EXPECT_EQ(pointer_events[1].x, 4.0);
158 EXPECT_EQ(pointer_events[1].y, 8.0);
159 EXPECT_EQ(pointer_events[1].device_kind, kFlutterPointerDeviceKindMouse);
160 EXPECT_EQ(pointer_events[1].buttons, kFlutterPointerButtonMousePrimary);
161 EXPECT_EQ(pointer_events[1].view_id, 42);
162}
163
164TEST_F(FlPointerManagerTest, NoEnterButtonPress) {
165 StartEngine();
166
167 std::vector<FlutterPointerEvent> pointer_events;
169 SendPointerEvent,
170 ([&pointer_events](auto engine, const FlutterPointerEvent* events,
171 size_t events_count) {
172 for (size_t i = 0; i < events_count; i++) {
173 pointer_events.push_back(events[i]);
174 }
175
176 return kSuccess;
177 }));
178
179 g_autoptr(FlPointerManager) manager = fl_pointer_manager_new(42, engine);
182 8.0, GDK_BUTTON_PRIMARY, 0, 0);
183
184 EXPECT_EQ(pointer_events.size(), 2u);
185
186 // Synthetic enter events
187 EXPECT_EQ(pointer_events[0].timestamp, 1234000u);
188 EXPECT_EQ(pointer_events[0].x, 4.0);
189 EXPECT_EQ(pointer_events[0].y, 8.0);
190 EXPECT_EQ(pointer_events[0].device_kind, kFlutterPointerDeviceKindMouse);
191 EXPECT_EQ(pointer_events[0].buttons, 0);
192 EXPECT_EQ(pointer_events[0].view_id, 42);
193
194 EXPECT_EQ(pointer_events[1].timestamp, 1234000u);
195 EXPECT_EQ(pointer_events[1].x, 4.0);
196 EXPECT_EQ(pointer_events[1].y, 8.0);
197 EXPECT_EQ(pointer_events[1].device_kind, kFlutterPointerDeviceKindMouse);
198 EXPECT_EQ(pointer_events[1].buttons, kFlutterPointerButtonMousePrimary);
199 EXPECT_EQ(pointer_events[1].view_id, 42);
200}
201
202TEST_F(FlPointerManagerTest, ButtonPressButtonReleasePrimary) {
203 StartEngine();
204
205 std::vector<FlutterPointerEvent> pointer_events;
207 SendPointerEvent,
208 ([&pointer_events](auto engine, const FlutterPointerEvent* events,
209 size_t events_count) {
210 for (size_t i = 0; i < events_count; i++) {
211 pointer_events.push_back(events[i]);
212 }
213
214 return kSuccess;
215 }));
216
217 g_autoptr(FlPointerManager) manager = fl_pointer_manager_new(42, engine);
220 8.0, GDK_BUTTON_PRIMARY, 0, 0);
223 9.0, GDK_BUTTON_PRIMARY, 0, 0);
224
225 EXPECT_EQ(pointer_events.size(), 3u);
226
227 // Ignore first synthetic enter event
228 EXPECT_EQ(pointer_events[1].timestamp, 1234000u);
229 EXPECT_EQ(pointer_events[1].x, 4.0);
230 EXPECT_EQ(pointer_events[1].y, 8.0);
231 EXPECT_EQ(pointer_events[1].device_kind, kFlutterPointerDeviceKindMouse);
232 EXPECT_EQ(pointer_events[1].buttons, kFlutterPointerButtonMousePrimary);
233 EXPECT_EQ(pointer_events[1].view_id, 42);
234 EXPECT_EQ(pointer_events[2].timestamp, 1235000u);
235 EXPECT_EQ(pointer_events[2].x, 5.0);
236 EXPECT_EQ(pointer_events[2].y, 9.0);
237 EXPECT_EQ(pointer_events[2].device_kind, kFlutterPointerDeviceKindMouse);
238 EXPECT_EQ(pointer_events[2].buttons, 0);
239 EXPECT_EQ(pointer_events[2].view_id, 42);
240}
241
242TEST_F(FlPointerManagerTest, ButtonPressButtonReleaseSecondary) {
243 StartEngine();
244
245 std::vector<FlutterPointerEvent> pointer_events;
247 SendPointerEvent,
248 ([&pointer_events](auto engine, const FlutterPointerEvent* events,
249 size_t events_count) {
250 for (size_t i = 0; i < events_count; i++) {
251 pointer_events.push_back(events[i]);
252 }
253
254 return kSuccess;
255 }));
256
257 g_autoptr(FlPointerManager) manager = fl_pointer_manager_new(42, engine);
260 8.0, GDK_BUTTON_SECONDARY, 0, 0);
263 9.0, GDK_BUTTON_SECONDARY, 0, 0);
264
265 EXPECT_EQ(pointer_events.size(), 3u);
266
267 // Ignore first synthetic enter event
268 EXPECT_EQ(pointer_events[1].timestamp, 1234000u);
269 EXPECT_EQ(pointer_events[1].x, 4.0);
270 EXPECT_EQ(pointer_events[1].y, 8.0);
271 EXPECT_EQ(pointer_events[1].device_kind, kFlutterPointerDeviceKindMouse);
272 EXPECT_EQ(pointer_events[1].buttons, kFlutterPointerButtonMouseSecondary);
273 EXPECT_EQ(pointer_events[1].view_id, 42);
274 EXPECT_EQ(pointer_events[2].timestamp, 1235000u);
275 EXPECT_EQ(pointer_events[2].x, 5.0);
276 EXPECT_EQ(pointer_events[2].y, 9.0);
277 EXPECT_EQ(pointer_events[2].device_kind, kFlutterPointerDeviceKindMouse);
278 EXPECT_EQ(pointer_events[2].buttons, 0);
279 EXPECT_EQ(pointer_events[2].view_id, 42);
280}
281
282TEST_F(FlPointerManagerTest, ButtonPressButtonReleaseMiddle) {
283 StartEngine();
284
285 std::vector<FlutterPointerEvent> pointer_events;
287 SendPointerEvent,
288 ([&pointer_events](auto engine, const FlutterPointerEvent* events,
289 size_t events_count) {
290 for (size_t i = 0; i < events_count; i++) {
291 pointer_events.push_back(events[i]);
292 }
293
294 return kSuccess;
295 }));
296
297 g_autoptr(FlPointerManager) manager = fl_pointer_manager_new(42, engine);
300 8.0, GDK_BUTTON_MIDDLE, 0, 0);
303 9.0, GDK_BUTTON_MIDDLE, 0, 0);
304
305 EXPECT_EQ(pointer_events.size(), 3u);
306
307 // Ignore first synthetic enter event
308 EXPECT_EQ(pointer_events[1].timestamp, 1234000u);
309 EXPECT_EQ(pointer_events[1].x, 4.0);
310 EXPECT_EQ(pointer_events[1].y, 8.0);
311 EXPECT_EQ(pointer_events[1].device_kind, kFlutterPointerDeviceKindMouse);
312 EXPECT_EQ(pointer_events[1].buttons, kFlutterPointerButtonMouseMiddle);
313 EXPECT_EQ(pointer_events[1].view_id, 42);
314 EXPECT_EQ(pointer_events[2].timestamp, 1235000u);
315 EXPECT_EQ(pointer_events[2].x, 5.0);
316 EXPECT_EQ(pointer_events[2].y, 9.0);
317 EXPECT_EQ(pointer_events[2].device_kind, kFlutterPointerDeviceKindMouse);
318 EXPECT_EQ(pointer_events[2].buttons, 0);
319 EXPECT_EQ(pointer_events[2].view_id, 42);
320}
321
322TEST_F(FlPointerManagerTest, ButtonPressButtonReleaseBack) {
323 StartEngine();
324
325 std::vector<FlutterPointerEvent> pointer_events;
327 SendPointerEvent,
328 ([&pointer_events](auto engine, const FlutterPointerEvent* events,
329 size_t events_count) {
330 for (size_t i = 0; i < events_count; i++) {
331 pointer_events.push_back(events[i]);
332 }
333
334 return kSuccess;
335 }));
336
337 // Forward button is 8 (no GDK define).
338 g_autoptr(FlPointerManager) manager = fl_pointer_manager_new(42, engine);
340 manager, 1234, kFlutterPointerDeviceKindMouse, 4.0, 8.0, 8, 0, 0);
342 manager, 1235, kFlutterPointerDeviceKindMouse, 5.0, 9.0, 8, 0, 0);
343
344 EXPECT_EQ(pointer_events.size(), 3u);
345
346 // Ignore first synthetic enter event
347 EXPECT_EQ(pointer_events[1].timestamp, 1234000u);
348 EXPECT_EQ(pointer_events[1].x, 4.0);
349 EXPECT_EQ(pointer_events[1].y, 8.0);
350 EXPECT_EQ(pointer_events[1].device_kind, kFlutterPointerDeviceKindMouse);
351 EXPECT_EQ(pointer_events[1].buttons, kFlutterPointerButtonMouseBack);
352 EXPECT_EQ(pointer_events[1].view_id, 42);
353 EXPECT_EQ(pointer_events[2].timestamp, 1235000u);
354 EXPECT_EQ(pointer_events[2].x, 5.0);
355 EXPECT_EQ(pointer_events[2].y, 9.0);
356 EXPECT_EQ(pointer_events[2].device_kind, kFlutterPointerDeviceKindMouse);
357 EXPECT_EQ(pointer_events[2].buttons, 0);
358 EXPECT_EQ(pointer_events[2].view_id, 42);
359}
360
361TEST_F(FlPointerManagerTest, ButtonPressButtonReleaseForward) {
362 StartEngine();
363
364 std::vector<FlutterPointerEvent> pointer_events;
366 SendPointerEvent,
367 ([&pointer_events](auto engine, const FlutterPointerEvent* events,
368 size_t events_count) {
369 for (size_t i = 0; i < events_count; i++) {
370 pointer_events.push_back(events[i]);
371 }
372
373 return kSuccess;
374 }));
375
376 // Forward button is 9 (no GDK define).
377 g_autoptr(FlPointerManager) manager = fl_pointer_manager_new(42, engine);
379 manager, 1234, kFlutterPointerDeviceKindMouse, 4.0, 8.0, 9, 0, 0);
381 manager, 1235, kFlutterPointerDeviceKindMouse, 5.0, 9.0, 9, 0, 0);
382
383 EXPECT_EQ(pointer_events.size(), 3u);
384
385 // Ignore first synthetic enter event
386 EXPECT_EQ(pointer_events[1].timestamp, 1234000u);
387 EXPECT_EQ(pointer_events[1].x, 4.0);
388 EXPECT_EQ(pointer_events[1].y, 8.0);
389 EXPECT_EQ(pointer_events[1].device_kind, kFlutterPointerDeviceKindMouse);
390 EXPECT_EQ(pointer_events[1].buttons, kFlutterPointerButtonMouseForward);
391 EXPECT_EQ(pointer_events[1].view_id, 42);
392 EXPECT_EQ(pointer_events[2].timestamp, 1235000u);
393 EXPECT_EQ(pointer_events[2].x, 5.0);
394 EXPECT_EQ(pointer_events[2].y, 9.0);
395 EXPECT_EQ(pointer_events[2].device_kind, kFlutterPointerDeviceKindMouse);
396 EXPECT_EQ(pointer_events[2].buttons, 0);
397 EXPECT_EQ(pointer_events[2].view_id, 42);
398}
399
400TEST_F(FlPointerManagerTest, ButtonPressButtonReleaseThreeButtons) {
401 StartEngine();
402
403 std::vector<FlutterPointerEvent> pointer_events;
405 SendPointerEvent,
406 ([&pointer_events](auto engine, const FlutterPointerEvent* events,
407 size_t events_count) {
408 for (size_t i = 0; i < events_count; i++) {
409 pointer_events.push_back(events[i]);
410 }
411
412 return kSuccess;
413 }));
414
415 g_autoptr(FlPointerManager) manager = fl_pointer_manager_new(42, engine);
416 // Press buttons 1-2-3, release 3-2-1
419 2.0, GDK_BUTTON_PRIMARY, 0, 0);
422 4.0, GDK_BUTTON_SECONDARY, 0, 0);
425 6.0, GDK_BUTTON_MIDDLE, 0, 0);
428 8.0, GDK_BUTTON_MIDDLE, 0, 0);
431 10.0, GDK_BUTTON_SECONDARY, 0, 0);
433 manager, 1239, kFlutterPointerDeviceKindMouse, 11.0, 12.0,
435
436 EXPECT_EQ(pointer_events.size(), 7u);
437
438 // Ignore first synthetic enter event
439 EXPECT_EQ(pointer_events[1].timestamp, 1234000u);
440 EXPECT_EQ(pointer_events[1].x, 1.0);
441 EXPECT_EQ(pointer_events[1].y, 2.0);
442 EXPECT_EQ(pointer_events[1].buttons, kFlutterPointerButtonMousePrimary);
443 EXPECT_EQ(pointer_events[2].timestamp, 1235000u);
444 EXPECT_EQ(pointer_events[2].x, 3.0);
445 EXPECT_EQ(pointer_events[2].y, 4.0);
446 EXPECT_EQ(pointer_events[2].buttons, kFlutterPointerButtonMousePrimary |
448 EXPECT_EQ(pointer_events[3].timestamp, 1236000u);
449 EXPECT_EQ(pointer_events[3].x, 5.0);
450 EXPECT_EQ(pointer_events[3].y, 6.0);
451 EXPECT_EQ(pointer_events[3].buttons, kFlutterPointerButtonMousePrimary |
454 EXPECT_EQ(pointer_events[4].timestamp, 1237000u);
455 EXPECT_EQ(pointer_events[4].x, 7.0);
456 EXPECT_EQ(pointer_events[4].y, 8.0);
457 EXPECT_EQ(pointer_events[4].buttons, kFlutterPointerButtonMousePrimary |
459 EXPECT_EQ(pointer_events[5].timestamp, 1238000u);
460 EXPECT_EQ(pointer_events[5].x, 9.0);
461 EXPECT_EQ(pointer_events[5].y, 10.0);
462 EXPECT_EQ(pointer_events[5].buttons, kFlutterPointerButtonMousePrimary);
463 EXPECT_EQ(pointer_events[6].timestamp, 1239000u);
464 EXPECT_EQ(pointer_events[6].x, 11.0);
465 EXPECT_EQ(pointer_events[6].y, 12.0);
466 EXPECT_EQ(pointer_events[6].buttons, 0);
467}
468
469TEST_F(FlPointerManagerTest, ButtonPressStylusPrimaryButton) {
470 StartEngine();
471
472 constexpr int64_t kStylusContact = 1 << 0;
473 constexpr int64_t kStylusPrimary = 1 << 1;
474
475 std::vector<FlutterPointerEvent> pointer_events;
477 SendPointerEvent,
478 ([&pointer_events](auto engine, const FlutterPointerEvent* events,
479 size_t events_count) {
480 for (size_t i = 0; i < events_count; i++) {
481 pointer_events.push_back(events[i]);
482 }
483
484 return kSuccess;
485 }));
486
487 g_autoptr(FlPointerManager) manager = fl_pointer_manager_new(42, engine);
490 8.0, GDK_BUTTON_PRIMARY, 0.0, 0.5);
493 8.0, GDK_BUTTON_SECONDARY, 0.0, 0.5);
494
495 EXPECT_EQ(pointer_events.size(), 3u);
496 EXPECT_EQ(pointer_events[2].device_kind, kFlutterPointerDeviceKindStylus);
497 EXPECT_EQ(pointer_events[2].buttons, kStylusContact | kStylusPrimary);
498}
499
500TEST_F(FlPointerManagerTest, ButtonPressStylusContact) {
501 StartEngine();
502
503 constexpr int64_t kStylusContact = 1 << 0;
504
505 std::vector<FlutterPointerEvent> pointer_events;
507 SendPointerEvent,
508 ([&pointer_events](auto engine, const FlutterPointerEvent* events,
509 size_t events_count) {
510 for (size_t i = 0; i < events_count; i++) {
511 pointer_events.push_back(events[i]);
512 }
513
514 return kSuccess;
515 }));
516
517 g_autoptr(FlPointerManager) manager = fl_pointer_manager_new(42, engine);
520 8.0, GDK_BUTTON_PRIMARY, 0.0, 0.5);
521
522 EXPECT_EQ(pointer_events.size(), 2u);
523 EXPECT_EQ(pointer_events[1].device_kind, kFlutterPointerDeviceKindStylus);
524 EXPECT_EQ(pointer_events[1].buttons, kStylusContact);
525}
526
527TEST_F(FlPointerManagerTest, ButtonPressInvertedStylusContact) {
528 StartEngine();
529
530 constexpr int64_t kStylusContact = 1 << 0;
531
532 std::vector<FlutterPointerEvent> pointer_events;
534 SendPointerEvent,
535 ([&pointer_events](auto engine, const FlutterPointerEvent* events,
536 size_t events_count) {
537 for (size_t i = 0; i < events_count; i++) {
538 pointer_events.push_back(events[i]);
539 }
540
541 return kSuccess;
542 }));
543
544 g_autoptr(FlPointerManager) manager = fl_pointer_manager_new(42, engine);
546 manager, 1234, kFlutterPointerDeviceKindInvertedStylus, 4.0, 8.0,
547 GDK_BUTTON_PRIMARY, 0.0, 0.5);
548
549 EXPECT_EQ(pointer_events.size(), 2u);
550 EXPECT_EQ(pointer_events[1].device_kind,
552 EXPECT_EQ(pointer_events[1].buttons, kStylusContact);
553}
554
555TEST_F(FlPointerManagerTest, ButtonPressStylusSecondaryButton) {
556 StartEngine();
557
558 constexpr int64_t kStylusContact = 1 << 0;
559 constexpr int64_t kStylusSecondary = 1 << 2;
560
561 std::vector<FlutterPointerEvent> pointer_events;
563 SendPointerEvent,
564 ([&pointer_events](auto engine, const FlutterPointerEvent* events,
565 size_t events_count) {
566 for (size_t i = 0; i < events_count; i++) {
567 pointer_events.push_back(events[i]);
568 }
569
570 return kSuccess;
571 }));
572
573 g_autoptr(FlPointerManager) manager = fl_pointer_manager_new(42, engine);
576 8.0, GDK_BUTTON_PRIMARY, 0.0, 0.5);
579 8.0, GDK_BUTTON_MIDDLE, 0.0, 0.5);
580
581 EXPECT_EQ(pointer_events.size(), 3u);
582 EXPECT_EQ(pointer_events[2].device_kind, kFlutterPointerDeviceKindStylus);
583 EXPECT_EQ(pointer_events[2].buttons, kStylusContact | kStylusSecondary);
584}
585
586TEST_F(FlPointerManagerTest, ButtonPressStylusUnknownButton) {
587 StartEngine();
588
589 std::vector<FlutterPointerEvent> pointer_events;
591 SendPointerEvent,
592 ([&pointer_events](auto engine, const FlutterPointerEvent* events,
593 size_t events_count) {
594 for (size_t i = 0; i < events_count; i++) {
595 pointer_events.push_back(events[i]);
596 }
597
598 return kSuccess;
599 }));
600
601 g_autoptr(FlPointerManager) manager = fl_pointer_manager_new(42, engine);
603 manager, 1234, kFlutterPointerDeviceKindStylus, 4.0, 8.0, 8, 0, 0);
604
605 EXPECT_EQ(pointer_events.size(), 0u);
606}
607
608TEST_F(FlPointerManagerTest, ButtonPressButtonPressButtonRelease) {
609 StartEngine();
610
611 std::vector<FlutterPointerEvent> pointer_events;
613 SendPointerEvent,
614 ([&pointer_events](auto engine, const FlutterPointerEvent* events,
615 size_t events_count) {
616 for (size_t i = 0; i < events_count; i++) {
617 pointer_events.push_back(events[i]);
618 }
619
620 return kSuccess;
621 }));
622
623 g_autoptr(FlPointerManager) manager = fl_pointer_manager_new(42, engine);
626 8.0, GDK_BUTTON_PRIMARY, 0, 0);
627 // Ignore duplicate press
630 10.0, GDK_BUTTON_PRIMARY, 0, 0);
633 9.0, GDK_BUTTON_PRIMARY, 0, 0);
634
635 EXPECT_EQ(pointer_events.size(), 3u);
636
637 // Ignore first synthetic enter event
638 EXPECT_EQ(pointer_events[1].timestamp, 1234000u);
639 EXPECT_EQ(pointer_events[1].x, 4.0);
640 EXPECT_EQ(pointer_events[1].y, 8.0);
641 EXPECT_EQ(pointer_events[1].device_kind, kFlutterPointerDeviceKindMouse);
642 EXPECT_EQ(pointer_events[1].buttons, kFlutterPointerButtonMousePrimary);
643 EXPECT_EQ(pointer_events[1].view_id, 42);
644 EXPECT_EQ(pointer_events[2].timestamp, 1235000u);
645 EXPECT_EQ(pointer_events[2].x, 5.0);
646 EXPECT_EQ(pointer_events[2].y, 9.0);
647 EXPECT_EQ(pointer_events[2].device_kind, kFlutterPointerDeviceKindMouse);
648 EXPECT_EQ(pointer_events[2].buttons, 0);
649 EXPECT_EQ(pointer_events[2].view_id, 42);
650}
651
652TEST_F(FlPointerManagerTest, ButtonPressButtonReleaseButtonRelease) {
653 StartEngine();
654
655 std::vector<FlutterPointerEvent> pointer_events;
657 SendPointerEvent,
658 ([&pointer_events](auto engine, const FlutterPointerEvent* events,
659 size_t events_count) {
660 for (size_t i = 0; i < events_count; i++) {
661 pointer_events.push_back(events[i]);
662 }
663
664 return kSuccess;
665 }));
666
667 g_autoptr(FlPointerManager) manager = fl_pointer_manager_new(42, engine);
670 8.0, GDK_BUTTON_PRIMARY, 0, 0);
673 9.0, GDK_BUTTON_PRIMARY, 0, 0);
674 // Ignore duplicate release
677 10.0, GDK_BUTTON_PRIMARY, 0, 0);
678
679 EXPECT_EQ(pointer_events.size(), 3u);
680
681 // Ignore first synthetic enter event
682 EXPECT_EQ(pointer_events[1].timestamp, 1234000u);
683 EXPECT_EQ(pointer_events[1].x, 4.0);
684 EXPECT_EQ(pointer_events[1].y, 8.0);
685 EXPECT_EQ(pointer_events[1].device_kind, kFlutterPointerDeviceKindMouse);
686 EXPECT_EQ(pointer_events[1].buttons, kFlutterPointerButtonMousePrimary);
687 EXPECT_EQ(pointer_events[1].view_id, 42);
688 EXPECT_EQ(pointer_events[2].timestamp, 1235000u);
689 EXPECT_EQ(pointer_events[2].x, 5.0);
690 EXPECT_EQ(pointer_events[2].y, 9.0);
691 EXPECT_EQ(pointer_events[2].device_kind, kFlutterPointerDeviceKindMouse);
692 EXPECT_EQ(pointer_events[2].buttons, 0);
693 EXPECT_EQ(pointer_events[2].view_id, 42);
694}
695
696TEST_F(FlPointerManagerTest, NoButtonPressButtonRelease) {
697 StartEngine();
698
699 std::vector<FlutterPointerEvent> pointer_events;
701 SendPointerEvent,
702 ([&pointer_events](auto engine, const FlutterPointerEvent* events,
703 size_t events_count) {
704 for (size_t i = 0; i < events_count; i++) {
705 pointer_events.push_back(events[i]);
706 }
707
708 return kSuccess;
709 }));
710
711 g_autoptr(FlPointerManager) manager = fl_pointer_manager_new(42, engine);
712 // Release without associated press, will be ignored
715 9.0, GDK_BUTTON_PRIMARY, 0, 0);
716
717 EXPECT_EQ(pointer_events.size(), 0u);
718}
719
721 StartEngine();
722
723 std::vector<FlutterPointerEvent> pointer_events;
725 SendPointerEvent,
726 ([&pointer_events](auto engine, const FlutterPointerEvent* events,
727 size_t events_count) {
728 for (size_t i = 0; i < events_count; i++) {
729 pointer_events.push_back(events[i]);
730 }
731
732 return kSuccess;
733 }));
734
735 g_autoptr(FlPointerManager) manager = fl_pointer_manager_new(42, engine);
737 manager, 1234, kFlutterPointerDeviceKindMouse, 1.0, 2.0, 0, 0);
739 manager, 1235, kFlutterPointerDeviceKindMouse, 3.0, 4.0, 0, 0);
741 manager, 1236, kFlutterPointerDeviceKindMouse, 5.0, 6.0, 0, 0);
742
743 EXPECT_EQ(pointer_events.size(), 4u);
744
745 // Ignore first synthetic enter event
746 EXPECT_EQ(pointer_events[1].timestamp, 1234000u);
747 EXPECT_EQ(pointer_events[1].x, 1.0);
748 EXPECT_EQ(pointer_events[1].y, 2.0);
749 EXPECT_EQ(pointer_events[1].device_kind, kFlutterPointerDeviceKindMouse);
750 EXPECT_EQ(pointer_events[1].buttons, 0);
751 EXPECT_EQ(pointer_events[1].view_id, 42);
752 EXPECT_EQ(pointer_events[2].timestamp, 1235000u);
753 EXPECT_EQ(pointer_events[2].x, 3.0);
754 EXPECT_EQ(pointer_events[2].y, 4.0);
755 EXPECT_EQ(pointer_events[2].device_kind, kFlutterPointerDeviceKindMouse);
756 EXPECT_EQ(pointer_events[2].buttons, 0);
757 EXPECT_EQ(pointer_events[2].view_id, 42);
758 EXPECT_EQ(pointer_events[3].timestamp, 1236000u);
759 EXPECT_EQ(pointer_events[3].x, 5.0);
760 EXPECT_EQ(pointer_events[3].y, 6.0);
761 EXPECT_EQ(pointer_events[3].device_kind, kFlutterPointerDeviceKindMouse);
762 EXPECT_EQ(pointer_events[3].buttons, 0);
763 EXPECT_EQ(pointer_events[3].view_id, 42);
764}
765
767 StartEngine();
768
769 std::vector<FlutterPointerEvent> pointer_events;
771 SendPointerEvent,
772 ([&pointer_events](auto engine, const FlutterPointerEvent* events,
773 size_t events_count) {
774 for (size_t i = 0; i < events_count; i++) {
775 pointer_events.push_back(events[i]);
776 }
777
778 return kSuccess;
779 }));
780
781 g_autoptr(FlPointerManager) manager = fl_pointer_manager_new(42, engine);
783 manager, 1234, kFlutterPointerDeviceKindMouse, 1.0, 2.0, 0, 0);
786 4.0, GDK_BUTTON_PRIMARY, 0, 0);
788 manager, 1236, kFlutterPointerDeviceKindMouse, 5.0, 6.0, 0, 0);
791 8.0, GDK_BUTTON_PRIMARY, 0, 0);
793 manager, 1238, kFlutterPointerDeviceKindMouse, 9.0, 10.0, 0, 0);
794
795 EXPECT_EQ(pointer_events.size(), 6u);
796
797 // Ignore first synthetic enter event
798 EXPECT_EQ(pointer_events[1].timestamp, 1234000u);
799 EXPECT_EQ(pointer_events[1].x, 1.0);
800 EXPECT_EQ(pointer_events[1].y, 2.0);
801 EXPECT_EQ(pointer_events[1].buttons, 0);
802 EXPECT_EQ(pointer_events[1].view_id, 42);
803 EXPECT_EQ(pointer_events[2].timestamp, 1235000u);
804 EXPECT_EQ(pointer_events[2].x, 3.0);
805 EXPECT_EQ(pointer_events[2].y, 4.0);
806 EXPECT_EQ(pointer_events[2].buttons, kFlutterPointerButtonMousePrimary);
807 EXPECT_EQ(pointer_events[2].view_id, 42);
808 EXPECT_EQ(pointer_events[3].timestamp, 1236000u);
809 EXPECT_EQ(pointer_events[3].x, 5.0);
810 EXPECT_EQ(pointer_events[3].y, 6.0);
811 EXPECT_EQ(pointer_events[3].buttons, kFlutterPointerButtonMousePrimary);
812 EXPECT_EQ(pointer_events[3].view_id, 42);
813 EXPECT_EQ(pointer_events[4].timestamp, 1237000u);
814 EXPECT_EQ(pointer_events[4].x, 7.0);
815 EXPECT_EQ(pointer_events[4].y, 8.0);
816 EXPECT_EQ(pointer_events[4].buttons, 0);
817 EXPECT_EQ(pointer_events[4].view_id, 42);
818 EXPECT_EQ(pointer_events[5].timestamp, 1238000u);
819 EXPECT_EQ(pointer_events[5].x, 9.0);
820 EXPECT_EQ(pointer_events[5].y, 10.0);
821 EXPECT_EQ(pointer_events[5].buttons, 0);
822 EXPECT_EQ(pointer_events[5].view_id, 42);
823}
824
826 StartEngine();
827
828 std::vector<FlutterPointerEvent> pointer_events;
830 SendPointerEvent,
831 ([&pointer_events](auto engine, const FlutterPointerEvent* events,
832 size_t events_count) {
833 for (size_t i = 0; i < events_count; i++) {
834 pointer_events.push_back(events[i]);
835 }
836
837 return kSuccess;
838 }));
839
840 g_autoptr(FlPointerManager) manager = fl_pointer_manager_new(42, engine);
842 manager, 1234, kFlutterPointerDeviceKindTrackpad, 1.0, 2.0, 0, 0);
845 2.0, GDK_BUTTON_PRIMARY, 0, 0);
847 manager, 1238, kFlutterPointerDeviceKindTrackpad, 3.0, 4.0, 0, 0);
850 3.0, 4.0, GDK_BUTTON_PRIMARY, 0, 0);
852 manager, 1235, kFlutterPointerDeviceKindTrackpad, 3.0, 4.0, 0, 0);
853
854 EXPECT_EQ(pointer_events.size(), 5u);
855
856 EXPECT_EQ(pointer_events[0].device_kind, kFlutterPointerDeviceKindTrackpad);
857 EXPECT_EQ(pointer_events[1].device_kind, kFlutterPointerDeviceKindTrackpad);
858 EXPECT_EQ(pointer_events[2].device_kind, kFlutterPointerDeviceKindTrackpad);
859 EXPECT_EQ(pointer_events[3].device_kind, kFlutterPointerDeviceKindTrackpad);
860 EXPECT_EQ(pointer_events[4].device_kind, kFlutterPointerDeviceKindTrackpad);
861}
int32_t x
@ kFlutterPointerButtonMousePrimary
Definition embedder.h:1320
@ kFlutterPointerButtonMouseMiddle
Definition embedder.h:1322
@ kFlutterPointerButtonMouseForward
Definition embedder.h:1324
@ kFlutterPointerButtonMouseBack
Definition embedder.h:1323
@ kFlutterPointerButtonMouseSecondary
Definition embedder.h:1321
@ kSuccess
Definition embedder.h:73
@ kFlutterPointerDeviceKindInvertedStylus
Definition embedder.h:1314
@ kFlutterPointerDeviceKindTrackpad
Definition embedder.h:1313
@ kFlutterPointerDeviceKindStylus
Definition embedder.h:1312
@ kFlutterPointerDeviceKindMouse
Definition embedder.h:1310
FlutterEngine engine
Definition main.cc:84
g_autoptr(FlEngine) engine
FlutterEngineProcTable * fl_engine_get_embedder_api(FlEngine *self)
Definition fl_engine.cc:920
gboolean fl_pointer_manager_handle_enter(FlPointerManager *self, guint event_time, FlutterPointerDeviceKind device_kind, gdouble x, gdouble y, gdouble rotation, gdouble pressure)
FlPointerManager * fl_pointer_manager_new(FlutterViewId view_id, FlEngine *engine)
gboolean fl_pointer_manager_handle_button_press(FlPointerManager *self, guint event_time, FlutterPointerDeviceKind device_kind, gdouble x, gdouble y, guint gdk_button, gdouble rotation, gdouble pressure)
gboolean fl_pointer_manager_handle_motion(FlPointerManager *self, guint event_time, FlutterPointerDeviceKind device_kind, gdouble x, gdouble y, gdouble rotation, gdouble pressure)
gboolean fl_pointer_manager_handle_button_release(FlPointerManager *self, guint event_time, FlutterPointerDeviceKind device_kind, gdouble x, gdouble y, guint gdk_button, gdouble rotation, gdouble pressure)
gboolean fl_pointer_manager_handle_leave(FlPointerManager *self, guint event_time, FlutterPointerDeviceKind device_kind, gdouble x, gdouble y, gdouble rotation, gdouble pressure)
TEST_F(FlPointerManagerTest, EnterLeave)
G_BEGIN_DECLS FlutterViewId view_id
double y
#define MOCK_ENGINE_PROC(proc, mock_impl)
FlutterEngineSendPointerEventFnPtr SendPointerEvent
Definition embedder.h:3775