Flutter Engine
 
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
9#include "gtest/gtest.h"
10
11TEST(FlPointerManagerTest, EnterLeave) {
12 g_autoptr(FlDartProject) project = fl_dart_project_new();
13 g_autoptr(FlEngine) engine = fl_engine_new(project);
14
15 g_autoptr(GError) error = nullptr;
16 EXPECT_TRUE(fl_engine_start(engine, &error));
17 EXPECT_EQ(error, nullptr);
18
19 std::vector<FlutterPointerEvent> pointer_events;
21 SendPointerEvent,
22 ([&pointer_events](auto engine, const FlutterPointerEvent* events,
23 size_t events_count) {
24 for (size_t i = 0; i < events_count; i++) {
25 pointer_events.push_back(events[i]);
26 }
27
28 return kSuccess;
29 }));
30
31 g_autoptr(FlPointerManager) manager = fl_pointer_manager_new(42, engine);
33 1.0, 2.0);
35 3.0, 4.0);
36
37 EXPECT_EQ(pointer_events.size(), 2u);
38
39 EXPECT_EQ(pointer_events[0].timestamp, 1234000u);
40 EXPECT_EQ(pointer_events[0].x, 1.0);
41 EXPECT_EQ(pointer_events[0].y, 2.0);
42 EXPECT_EQ(pointer_events[0].device_kind, kFlutterPointerDeviceKindMouse);
43 EXPECT_EQ(pointer_events[0].buttons, 0);
44 EXPECT_EQ(pointer_events[0].view_id, 42);
45
46 EXPECT_EQ(pointer_events[1].timestamp, 1235000u);
47 EXPECT_EQ(pointer_events[1].x, 3.0);
48 EXPECT_EQ(pointer_events[1].y, 4.0);
49 EXPECT_EQ(pointer_events[1].device_kind, kFlutterPointerDeviceKindMouse);
50 EXPECT_EQ(pointer_events[1].buttons, 0);
51 EXPECT_EQ(pointer_events[1].view_id, 42);
52}
53
54TEST(FlPointerManagerTest, EnterEnter) {
55 g_autoptr(FlDartProject) project = fl_dart_project_new();
56 g_autoptr(FlEngine) engine = fl_engine_new(project);
57
58 g_autoptr(GError) error = nullptr;
59 EXPECT_TRUE(fl_engine_start(engine, &error));
60 EXPECT_EQ(error, nullptr);
61
62 std::vector<FlutterPointerEvent> pointer_events;
64 SendPointerEvent,
65 ([&pointer_events](auto engine, const FlutterPointerEvent* events,
66 size_t events_count) {
67 for (size_t i = 0; i < events_count; i++) {
68 pointer_events.push_back(events[i]);
69 }
70
71 return kSuccess;
72 }));
73
74 g_autoptr(FlPointerManager) manager = fl_pointer_manager_new(42, engine);
76 1.0, 2.0);
77 // Duplicate enter is ignored
79 3.0, 4.0);
80
81 EXPECT_EQ(pointer_events.size(), 1u);
82
83 EXPECT_EQ(pointer_events[0].timestamp, 1234000u);
84 EXPECT_EQ(pointer_events[0].x, 1.0);
85 EXPECT_EQ(pointer_events[0].y, 2.0);
86 EXPECT_EQ(pointer_events[0].device_kind, kFlutterPointerDeviceKindMouse);
87 EXPECT_EQ(pointer_events[0].buttons, 0);
88 EXPECT_EQ(pointer_events[0].view_id, 42);
89}
90
91TEST(FlPointerManagerTest, EnterLeaveLeave) {
92 g_autoptr(FlDartProject) project = fl_dart_project_new();
93 g_autoptr(FlEngine) engine = fl_engine_new(project);
94
95 g_autoptr(GError) error = nullptr;
96 EXPECT_TRUE(fl_engine_start(engine, &error));
97 EXPECT_EQ(error, nullptr);
98
99 std::vector<FlutterPointerEvent> pointer_events;
101 SendPointerEvent,
102 ([&pointer_events](auto engine, const FlutterPointerEvent* events,
103 size_t events_count) {
104 for (size_t i = 0; i < events_count; i++) {
105 pointer_events.push_back(events[i]);
106 }
107
108 return kSuccess;
109 }));
110
111 g_autoptr(FlPointerManager) manager = fl_pointer_manager_new(42, engine);
113 1.0, 2.0);
115 3.0, 4.0);
116 // Duplicate leave is ignored
118 5.0, 6.0);
119
120 EXPECT_EQ(pointer_events.size(), 2u);
121
122 EXPECT_EQ(pointer_events[0].timestamp, 1234000u);
123 EXPECT_EQ(pointer_events[0].x, 1.0);
124 EXPECT_EQ(pointer_events[0].y, 2.0);
125 EXPECT_EQ(pointer_events[0].device_kind, kFlutterPointerDeviceKindMouse);
126 EXPECT_EQ(pointer_events[0].buttons, 0);
127 EXPECT_EQ(pointer_events[0].view_id, 42);
128
129 EXPECT_EQ(pointer_events[1].timestamp, 1235000u);
130 EXPECT_EQ(pointer_events[1].x, 3.0);
131 EXPECT_EQ(pointer_events[1].y, 4.0);
132 EXPECT_EQ(pointer_events[1].device_kind, kFlutterPointerDeviceKindMouse);
133 EXPECT_EQ(pointer_events[1].buttons, 0);
134 EXPECT_EQ(pointer_events[1].view_id, 42);
135}
136
137TEST(FlPointerManagerTest, EnterButtonPress) {
138 g_autoptr(FlDartProject) project = fl_dart_project_new();
139 g_autoptr(FlEngine) engine = fl_engine_new(project);
140
141 g_autoptr(GError) error = nullptr;
142 EXPECT_TRUE(fl_engine_start(engine, &error));
143 EXPECT_EQ(error, nullptr);
144
145 std::vector<FlutterPointerEvent> pointer_events;
147 SendPointerEvent,
148 ([&pointer_events](auto engine, const FlutterPointerEvent* events,
149 size_t events_count) {
150 for (size_t i = 0; i < events_count; i++) {
151 pointer_events.push_back(events[i]);
152 }
153
154 return kSuccess;
155 }));
156
157 g_autoptr(FlPointerManager) manager = fl_pointer_manager_new(42, engine);
159 1.0, 2.0);
162 8.0, GDK_BUTTON_PRIMARY);
163
164 EXPECT_EQ(pointer_events.size(), 2u);
165
166 EXPECT_EQ(pointer_events[0].timestamp, 1234000u);
167 EXPECT_EQ(pointer_events[0].x, 1.0);
168 EXPECT_EQ(pointer_events[0].y, 2.0);
169 EXPECT_EQ(pointer_events[0].device_kind, kFlutterPointerDeviceKindMouse);
170 EXPECT_EQ(pointer_events[0].buttons, 0);
171 EXPECT_EQ(pointer_events[0].view_id, 42);
172
173 EXPECT_EQ(pointer_events[1].timestamp, 1235000u);
174 EXPECT_EQ(pointer_events[1].x, 4.0);
175 EXPECT_EQ(pointer_events[1].y, 8.0);
176 EXPECT_EQ(pointer_events[1].device_kind, kFlutterPointerDeviceKindMouse);
177 EXPECT_EQ(pointer_events[1].buttons, kFlutterPointerButtonMousePrimary);
178 EXPECT_EQ(pointer_events[1].view_id, 42);
179}
180
181TEST(FlPointerManagerTest, NoEnterButtonPress) {
182 g_autoptr(FlDartProject) project = fl_dart_project_new();
183 g_autoptr(FlEngine) engine = fl_engine_new(project);
184
185 g_autoptr(GError) error = nullptr;
186 EXPECT_TRUE(fl_engine_start(engine, &error));
187 EXPECT_EQ(error, nullptr);
188
189 std::vector<FlutterPointerEvent> pointer_events;
191 SendPointerEvent,
192 ([&pointer_events](auto engine, const FlutterPointerEvent* events,
193 size_t events_count) {
194 for (size_t i = 0; i < events_count; i++) {
195 pointer_events.push_back(events[i]);
196 }
197
198 return kSuccess;
199 }));
200
201 g_autoptr(FlPointerManager) manager = fl_pointer_manager_new(42, engine);
204 8.0, GDK_BUTTON_PRIMARY);
205
206 EXPECT_EQ(pointer_events.size(), 2u);
207
208 // Synthetic enter events
209 EXPECT_EQ(pointer_events[0].timestamp, 1234000u);
210 EXPECT_EQ(pointer_events[0].x, 4.0);
211 EXPECT_EQ(pointer_events[0].y, 8.0);
212 EXPECT_EQ(pointer_events[0].device_kind, kFlutterPointerDeviceKindMouse);
213 EXPECT_EQ(pointer_events[0].buttons, 0);
214 EXPECT_EQ(pointer_events[0].view_id, 42);
215
216 EXPECT_EQ(pointer_events[1].timestamp, 1234000u);
217 EXPECT_EQ(pointer_events[1].x, 4.0);
218 EXPECT_EQ(pointer_events[1].y, 8.0);
219 EXPECT_EQ(pointer_events[1].device_kind, kFlutterPointerDeviceKindMouse);
220 EXPECT_EQ(pointer_events[1].buttons, kFlutterPointerButtonMousePrimary);
221 EXPECT_EQ(pointer_events[1].view_id, 42);
222}
223
224TEST(FlPointerManagerTest, ButtonPressButtonReleasePrimary) {
225 g_autoptr(FlDartProject) project = fl_dart_project_new();
226 g_autoptr(FlEngine) engine = fl_engine_new(project);
227
228 g_autoptr(GError) error = nullptr;
229 EXPECT_TRUE(fl_engine_start(engine, &error));
230 EXPECT_EQ(error, nullptr);
231
232 std::vector<FlutterPointerEvent> pointer_events;
234 SendPointerEvent,
235 ([&pointer_events](auto engine, const FlutterPointerEvent* events,
236 size_t events_count) {
237 for (size_t i = 0; i < events_count; i++) {
238 pointer_events.push_back(events[i]);
239 }
240
241 return kSuccess;
242 }));
243
244 g_autoptr(FlPointerManager) manager = fl_pointer_manager_new(42, engine);
247 8.0, GDK_BUTTON_PRIMARY);
250 9.0, GDK_BUTTON_PRIMARY);
251
252 EXPECT_EQ(pointer_events.size(), 3u);
253
254 // Ignore first synthetic enter event
255 EXPECT_EQ(pointer_events[1].timestamp, 1234000u);
256 EXPECT_EQ(pointer_events[1].x, 4.0);
257 EXPECT_EQ(pointer_events[1].y, 8.0);
258 EXPECT_EQ(pointer_events[1].device_kind, kFlutterPointerDeviceKindMouse);
259 EXPECT_EQ(pointer_events[1].buttons, kFlutterPointerButtonMousePrimary);
260 EXPECT_EQ(pointer_events[1].view_id, 42);
261 EXPECT_EQ(pointer_events[2].timestamp, 1235000u);
262 EXPECT_EQ(pointer_events[2].x, 5.0);
263 EXPECT_EQ(pointer_events[2].y, 9.0);
264 EXPECT_EQ(pointer_events[2].device_kind, kFlutterPointerDeviceKindMouse);
265 EXPECT_EQ(pointer_events[2].buttons, 0);
266 EXPECT_EQ(pointer_events[2].view_id, 42);
267}
268
269TEST(FlPointerManagerTest, ButtonPressButtonReleaseSecondary) {
270 g_autoptr(FlDartProject) project = fl_dart_project_new();
271 g_autoptr(FlEngine) engine = fl_engine_new(project);
272
273 g_autoptr(GError) error = nullptr;
274 EXPECT_TRUE(fl_engine_start(engine, &error));
275 EXPECT_EQ(error, nullptr);
276
277 std::vector<FlutterPointerEvent> pointer_events;
279 SendPointerEvent,
280 ([&pointer_events](auto engine, const FlutterPointerEvent* events,
281 size_t events_count) {
282 for (size_t i = 0; i < events_count; i++) {
283 pointer_events.push_back(events[i]);
284 }
285
286 return kSuccess;
287 }));
288
289 g_autoptr(FlPointerManager) manager = fl_pointer_manager_new(42, engine);
292 8.0, GDK_BUTTON_SECONDARY);
295 9.0, GDK_BUTTON_SECONDARY);
296
297 EXPECT_EQ(pointer_events.size(), 3u);
298
299 // Ignore first synthetic enter event
300 EXPECT_EQ(pointer_events[1].timestamp, 1234000u);
301 EXPECT_EQ(pointer_events[1].x, 4.0);
302 EXPECT_EQ(pointer_events[1].y, 8.0);
303 EXPECT_EQ(pointer_events[1].device_kind, kFlutterPointerDeviceKindMouse);
304 EXPECT_EQ(pointer_events[1].buttons, kFlutterPointerButtonMouseSecondary);
305 EXPECT_EQ(pointer_events[1].view_id, 42);
306 EXPECT_EQ(pointer_events[2].timestamp, 1235000u);
307 EXPECT_EQ(pointer_events[2].x, 5.0);
308 EXPECT_EQ(pointer_events[2].y, 9.0);
309 EXPECT_EQ(pointer_events[2].device_kind, kFlutterPointerDeviceKindMouse);
310 EXPECT_EQ(pointer_events[2].buttons, 0);
311 EXPECT_EQ(pointer_events[2].view_id, 42);
312}
313
314TEST(FlPointerManagerTest, ButtonPressButtonReleaseMiddle) {
315 g_autoptr(FlDartProject) project = fl_dart_project_new();
316 g_autoptr(FlEngine) engine = fl_engine_new(project);
317
318 g_autoptr(GError) error = nullptr;
319 EXPECT_TRUE(fl_engine_start(engine, &error));
320 EXPECT_EQ(error, nullptr);
321
322 std::vector<FlutterPointerEvent> pointer_events;
324 SendPointerEvent,
325 ([&pointer_events](auto engine, const FlutterPointerEvent* events,
326 size_t events_count) {
327 for (size_t i = 0; i < events_count; i++) {
328 pointer_events.push_back(events[i]);
329 }
330
331 return kSuccess;
332 }));
333
334 g_autoptr(FlPointerManager) manager = fl_pointer_manager_new(42, engine);
337 8.0, GDK_BUTTON_MIDDLE);
340 9.0, GDK_BUTTON_MIDDLE);
341
342 EXPECT_EQ(pointer_events.size(), 3u);
343
344 // Ignore first synthetic enter event
345 EXPECT_EQ(pointer_events[1].timestamp, 1234000u);
346 EXPECT_EQ(pointer_events[1].x, 4.0);
347 EXPECT_EQ(pointer_events[1].y, 8.0);
348 EXPECT_EQ(pointer_events[1].device_kind, kFlutterPointerDeviceKindMouse);
349 EXPECT_EQ(pointer_events[1].buttons, kFlutterPointerButtonMouseMiddle);
350 EXPECT_EQ(pointer_events[1].view_id, 42);
351 EXPECT_EQ(pointer_events[2].timestamp, 1235000u);
352 EXPECT_EQ(pointer_events[2].x, 5.0);
353 EXPECT_EQ(pointer_events[2].y, 9.0);
354 EXPECT_EQ(pointer_events[2].device_kind, kFlutterPointerDeviceKindMouse);
355 EXPECT_EQ(pointer_events[2].buttons, 0);
356 EXPECT_EQ(pointer_events[2].view_id, 42);
357}
358
359TEST(FlPointerManagerTest, ButtonPressButtonReleaseBack) {
360 g_autoptr(FlDartProject) project = fl_dart_project_new();
361 g_autoptr(FlEngine) engine = fl_engine_new(project);
362
363 g_autoptr(GError) error = nullptr;
364 EXPECT_TRUE(fl_engine_start(engine, &error));
365 EXPECT_EQ(error, nullptr);
366
367 std::vector<FlutterPointerEvent> pointer_events;
369 SendPointerEvent,
370 ([&pointer_events](auto engine, const FlutterPointerEvent* events,
371 size_t events_count) {
372 for (size_t i = 0; i < events_count; i++) {
373 pointer_events.push_back(events[i]);
374 }
375
376 return kSuccess;
377 }));
378
379 // Forward button is 8 (no GDK define).
380 g_autoptr(FlPointerManager) manager = fl_pointer_manager_new(42, engine);
382 manager, 1234, kFlutterPointerDeviceKindMouse, 4.0, 8.0, 8);
384 manager, 1235, kFlutterPointerDeviceKindMouse, 5.0, 9.0, 8);
385
386 EXPECT_EQ(pointer_events.size(), 3u);
387
388 // Ignore first synthetic enter event
389 EXPECT_EQ(pointer_events[1].timestamp, 1234000u);
390 EXPECT_EQ(pointer_events[1].x, 4.0);
391 EXPECT_EQ(pointer_events[1].y, 8.0);
392 EXPECT_EQ(pointer_events[1].device_kind, kFlutterPointerDeviceKindMouse);
393 EXPECT_EQ(pointer_events[1].buttons, kFlutterPointerButtonMouseBack);
394 EXPECT_EQ(pointer_events[1].view_id, 42);
395 EXPECT_EQ(pointer_events[2].timestamp, 1235000u);
396 EXPECT_EQ(pointer_events[2].x, 5.0);
397 EXPECT_EQ(pointer_events[2].y, 9.0);
398 EXPECT_EQ(pointer_events[2].device_kind, kFlutterPointerDeviceKindMouse);
399 EXPECT_EQ(pointer_events[2].buttons, 0);
400 EXPECT_EQ(pointer_events[2].view_id, 42);
401}
402
403TEST(FlPointerManagerTest, ButtonPressButtonReleaseForward) {
404 g_autoptr(FlDartProject) project = fl_dart_project_new();
405 g_autoptr(FlEngine) engine = fl_engine_new(project);
406
407 g_autoptr(GError) error = nullptr;
408 EXPECT_TRUE(fl_engine_start(engine, &error));
409 EXPECT_EQ(error, nullptr);
410
411 std::vector<FlutterPointerEvent> pointer_events;
413 SendPointerEvent,
414 ([&pointer_events](auto engine, const FlutterPointerEvent* events,
415 size_t events_count) {
416 for (size_t i = 0; i < events_count; i++) {
417 pointer_events.push_back(events[i]);
418 }
419
420 return kSuccess;
421 }));
422
423 // Forward button is 9 (no GDK define).
424 g_autoptr(FlPointerManager) manager = fl_pointer_manager_new(42, engine);
426 manager, 1234, kFlutterPointerDeviceKindMouse, 4.0, 8.0, 9);
428 manager, 1235, kFlutterPointerDeviceKindMouse, 5.0, 9.0, 9);
429
430 EXPECT_EQ(pointer_events.size(), 3u);
431
432 // Ignore first synthetic enter event
433 EXPECT_EQ(pointer_events[1].timestamp, 1234000u);
434 EXPECT_EQ(pointer_events[1].x, 4.0);
435 EXPECT_EQ(pointer_events[1].y, 8.0);
436 EXPECT_EQ(pointer_events[1].device_kind, kFlutterPointerDeviceKindMouse);
437 EXPECT_EQ(pointer_events[1].buttons, kFlutterPointerButtonMouseForward);
438 EXPECT_EQ(pointer_events[1].view_id, 42);
439 EXPECT_EQ(pointer_events[2].timestamp, 1235000u);
440 EXPECT_EQ(pointer_events[2].x, 5.0);
441 EXPECT_EQ(pointer_events[2].y, 9.0);
442 EXPECT_EQ(pointer_events[2].device_kind, kFlutterPointerDeviceKindMouse);
443 EXPECT_EQ(pointer_events[2].buttons, 0);
444 EXPECT_EQ(pointer_events[2].view_id, 42);
445}
446
447TEST(FlPointerManagerTest, ButtonPressButtonReleaseThreeButtons) {
448 g_autoptr(FlDartProject) project = fl_dart_project_new();
449 g_autoptr(FlEngine) engine = fl_engine_new(project);
450
451 g_autoptr(GError) error = nullptr;
452 EXPECT_TRUE(fl_engine_start(engine, &error));
453 EXPECT_EQ(error, nullptr);
454
455 std::vector<FlutterPointerEvent> pointer_events;
457 SendPointerEvent,
458 ([&pointer_events](auto engine, const FlutterPointerEvent* events,
459 size_t events_count) {
460 for (size_t i = 0; i < events_count; i++) {
461 pointer_events.push_back(events[i]);
462 }
463
464 return kSuccess;
465 }));
466
467 g_autoptr(FlPointerManager) manager = fl_pointer_manager_new(42, engine);
468 // Press buttons 1-2-3, release 3-2-1
471 2.0, GDK_BUTTON_PRIMARY);
474 4.0, GDK_BUTTON_SECONDARY);
477 6.0, GDK_BUTTON_MIDDLE);
480 8.0, GDK_BUTTON_MIDDLE);
483 10.0, GDK_BUTTON_SECONDARY);
485 manager, 1239, kFlutterPointerDeviceKindMouse, 11.0, 12.0,
487
488 EXPECT_EQ(pointer_events.size(), 7u);
489
490 // Ignore first synthetic enter event
491 EXPECT_EQ(pointer_events[1].timestamp, 1234000u);
492 EXPECT_EQ(pointer_events[1].x, 1.0);
493 EXPECT_EQ(pointer_events[1].y, 2.0);
494 EXPECT_EQ(pointer_events[1].buttons, kFlutterPointerButtonMousePrimary);
495 EXPECT_EQ(pointer_events[2].timestamp, 1235000u);
496 EXPECT_EQ(pointer_events[2].x, 3.0);
497 EXPECT_EQ(pointer_events[2].y, 4.0);
498 EXPECT_EQ(pointer_events[2].buttons, kFlutterPointerButtonMousePrimary |
500 EXPECT_EQ(pointer_events[3].timestamp, 1236000u);
501 EXPECT_EQ(pointer_events[3].x, 5.0);
502 EXPECT_EQ(pointer_events[3].y, 6.0);
503 EXPECT_EQ(pointer_events[3].buttons, kFlutterPointerButtonMousePrimary |
506 EXPECT_EQ(pointer_events[4].timestamp, 1237000u);
507 EXPECT_EQ(pointer_events[4].x, 7.0);
508 EXPECT_EQ(pointer_events[4].y, 8.0);
509 EXPECT_EQ(pointer_events[4].buttons, kFlutterPointerButtonMousePrimary |
511 EXPECT_EQ(pointer_events[5].timestamp, 1238000u);
512 EXPECT_EQ(pointer_events[5].x, 9.0);
513 EXPECT_EQ(pointer_events[5].y, 10.0);
514 EXPECT_EQ(pointer_events[5].buttons, kFlutterPointerButtonMousePrimary);
515 EXPECT_EQ(pointer_events[6].timestamp, 1239000u);
516 EXPECT_EQ(pointer_events[6].x, 11.0);
517 EXPECT_EQ(pointer_events[6].y, 12.0);
518 EXPECT_EQ(pointer_events[6].buttons, 0);
519}
520
521TEST(FlPointerManagerTest, ButtonPressButtonPressButtonRelease) {
522 g_autoptr(FlDartProject) project = fl_dart_project_new();
523 g_autoptr(FlEngine) engine = fl_engine_new(project);
524
525 g_autoptr(GError) error = nullptr;
526 EXPECT_TRUE(fl_engine_start(engine, &error));
527 EXPECT_EQ(error, nullptr);
528
529 std::vector<FlutterPointerEvent> pointer_events;
531 SendPointerEvent,
532 ([&pointer_events](auto engine, const FlutterPointerEvent* events,
533 size_t events_count) {
534 for (size_t i = 0; i < events_count; i++) {
535 pointer_events.push_back(events[i]);
536 }
537
538 return kSuccess;
539 }));
540
541 g_autoptr(FlPointerManager) manager = fl_pointer_manager_new(42, engine);
544 8.0, GDK_BUTTON_PRIMARY);
545 // Ignore duplicate press
548 10.0, GDK_BUTTON_PRIMARY);
551 9.0, GDK_BUTTON_PRIMARY);
552
553 EXPECT_EQ(pointer_events.size(), 3u);
554
555 // Ignore first synthetic enter event
556 EXPECT_EQ(pointer_events[1].timestamp, 1234000u);
557 EXPECT_EQ(pointer_events[1].x, 4.0);
558 EXPECT_EQ(pointer_events[1].y, 8.0);
559 EXPECT_EQ(pointer_events[1].device_kind, kFlutterPointerDeviceKindMouse);
560 EXPECT_EQ(pointer_events[1].buttons, kFlutterPointerButtonMousePrimary);
561 EXPECT_EQ(pointer_events[1].view_id, 42);
562 EXPECT_EQ(pointer_events[2].timestamp, 1235000u);
563 EXPECT_EQ(pointer_events[2].x, 5.0);
564 EXPECT_EQ(pointer_events[2].y, 9.0);
565 EXPECT_EQ(pointer_events[2].device_kind, kFlutterPointerDeviceKindMouse);
566 EXPECT_EQ(pointer_events[2].buttons, 0);
567 EXPECT_EQ(pointer_events[2].view_id, 42);
568}
569
570TEST(FlPointerManagerTest, ButtonPressButtonReleaseButtonRelease) {
571 g_autoptr(FlDartProject) project = fl_dart_project_new();
572 g_autoptr(FlEngine) engine = fl_engine_new(project);
573
574 g_autoptr(GError) error = nullptr;
575 EXPECT_TRUE(fl_engine_start(engine, &error));
576 EXPECT_EQ(error, nullptr);
577
578 std::vector<FlutterPointerEvent> pointer_events;
580 SendPointerEvent,
581 ([&pointer_events](auto engine, const FlutterPointerEvent* events,
582 size_t events_count) {
583 for (size_t i = 0; i < events_count; i++) {
584 pointer_events.push_back(events[i]);
585 }
586
587 return kSuccess;
588 }));
589
590 g_autoptr(FlPointerManager) manager = fl_pointer_manager_new(42, engine);
593 8.0, GDK_BUTTON_PRIMARY);
596 9.0, GDK_BUTTON_PRIMARY);
597 // Ignore duplicate release
600 10.0, GDK_BUTTON_PRIMARY);
601
602 EXPECT_EQ(pointer_events.size(), 3u);
603
604 // Ignore first synthetic enter event
605 EXPECT_EQ(pointer_events[1].timestamp, 1234000u);
606 EXPECT_EQ(pointer_events[1].x, 4.0);
607 EXPECT_EQ(pointer_events[1].y, 8.0);
608 EXPECT_EQ(pointer_events[1].device_kind, kFlutterPointerDeviceKindMouse);
609 EXPECT_EQ(pointer_events[1].buttons, kFlutterPointerButtonMousePrimary);
610 EXPECT_EQ(pointer_events[1].view_id, 42);
611 EXPECT_EQ(pointer_events[2].timestamp, 1235000u);
612 EXPECT_EQ(pointer_events[2].x, 5.0);
613 EXPECT_EQ(pointer_events[2].y, 9.0);
614 EXPECT_EQ(pointer_events[2].device_kind, kFlutterPointerDeviceKindMouse);
615 EXPECT_EQ(pointer_events[2].buttons, 0);
616 EXPECT_EQ(pointer_events[2].view_id, 42);
617}
618
619TEST(FlPointerManagerTest, NoButtonPressButtonRelease) {
620 g_autoptr(FlDartProject) project = fl_dart_project_new();
621 g_autoptr(FlEngine) engine = fl_engine_new(project);
622
623 g_autoptr(GError) error = nullptr;
624 EXPECT_TRUE(fl_engine_start(engine, &error));
625 EXPECT_EQ(error, nullptr);
626
627 std::vector<FlutterPointerEvent> pointer_events;
629 SendPointerEvent,
630 ([&pointer_events](auto engine, const FlutterPointerEvent* events,
631 size_t events_count) {
632 for (size_t i = 0; i < events_count; i++) {
633 pointer_events.push_back(events[i]);
634 }
635
636 return kSuccess;
637 }));
638
639 g_autoptr(FlPointerManager) manager = fl_pointer_manager_new(42, engine);
640 // Release without associated press, will be ignored
643 9.0, GDK_BUTTON_PRIMARY);
644
645 EXPECT_EQ(pointer_events.size(), 0u);
646}
647
648TEST(FlPointerManagerTest, Motion) {
649 g_autoptr(FlDartProject) project = fl_dart_project_new();
650 g_autoptr(FlEngine) engine = fl_engine_new(project);
651
652 g_autoptr(GError) error = nullptr;
653 EXPECT_TRUE(fl_engine_start(engine, &error));
654 EXPECT_EQ(error, nullptr);
655
656 std::vector<FlutterPointerEvent> pointer_events;
658 SendPointerEvent,
659 ([&pointer_events](auto engine, const FlutterPointerEvent* events,
660 size_t events_count) {
661 for (size_t i = 0; i < events_count; i++) {
662 pointer_events.push_back(events[i]);
663 }
664
665 return kSuccess;
666 }));
667
668 g_autoptr(FlPointerManager) manager = fl_pointer_manager_new(42, engine);
675
676 EXPECT_EQ(pointer_events.size(), 4u);
677
678 // Ignore first synthetic enter event
679 EXPECT_EQ(pointer_events[1].timestamp, 1234000u);
680 EXPECT_EQ(pointer_events[1].x, 1.0);
681 EXPECT_EQ(pointer_events[1].y, 2.0);
682 EXPECT_EQ(pointer_events[1].device_kind, kFlutterPointerDeviceKindMouse);
683 EXPECT_EQ(pointer_events[1].buttons, 0);
684 EXPECT_EQ(pointer_events[1].view_id, 42);
685 EXPECT_EQ(pointer_events[2].timestamp, 1235000u);
686 EXPECT_EQ(pointer_events[2].x, 3.0);
687 EXPECT_EQ(pointer_events[2].y, 4.0);
688 EXPECT_EQ(pointer_events[2].device_kind, kFlutterPointerDeviceKindMouse);
689 EXPECT_EQ(pointer_events[2].buttons, 0);
690 EXPECT_EQ(pointer_events[2].view_id, 42);
691 EXPECT_EQ(pointer_events[3].timestamp, 1236000u);
692 EXPECT_EQ(pointer_events[3].x, 5.0);
693 EXPECT_EQ(pointer_events[3].y, 6.0);
694 EXPECT_EQ(pointer_events[3].device_kind, kFlutterPointerDeviceKindMouse);
695 EXPECT_EQ(pointer_events[3].buttons, 0);
696 EXPECT_EQ(pointer_events[3].view_id, 42);
697}
698
699TEST(FlPointerManagerTest, Drag) {
700 g_autoptr(FlDartProject) project = fl_dart_project_new();
701 g_autoptr(FlEngine) engine = fl_engine_new(project);
702
703 g_autoptr(GError) error = nullptr;
704 EXPECT_TRUE(fl_engine_start(engine, &error));
705 EXPECT_EQ(error, nullptr);
706
707 std::vector<FlutterPointerEvent> pointer_events;
709 SendPointerEvent,
710 ([&pointer_events](auto engine, const FlutterPointerEvent* events,
711 size_t events_count) {
712 for (size_t i = 0; i < events_count; i++) {
713 pointer_events.push_back(events[i]);
714 }
715
716 return kSuccess;
717 }));
718
719 g_autoptr(FlPointerManager) manager = fl_pointer_manager_new(42, engine);
724 4.0, GDK_BUTTON_PRIMARY);
729 8.0, GDK_BUTTON_PRIMARY);
732
733 EXPECT_EQ(pointer_events.size(), 6u);
734
735 // Ignore first synthetic enter event
736 EXPECT_EQ(pointer_events[1].timestamp, 1234000u);
737 EXPECT_EQ(pointer_events[1].x, 1.0);
738 EXPECT_EQ(pointer_events[1].y, 2.0);
739 EXPECT_EQ(pointer_events[1].buttons, 0);
740 EXPECT_EQ(pointer_events[1].view_id, 42);
741 EXPECT_EQ(pointer_events[2].timestamp, 1235000u);
742 EXPECT_EQ(pointer_events[2].x, 3.0);
743 EXPECT_EQ(pointer_events[2].y, 4.0);
744 EXPECT_EQ(pointer_events[2].buttons, kFlutterPointerButtonMousePrimary);
745 EXPECT_EQ(pointer_events[2].view_id, 42);
746 EXPECT_EQ(pointer_events[3].timestamp, 1236000u);
747 EXPECT_EQ(pointer_events[3].x, 5.0);
748 EXPECT_EQ(pointer_events[3].y, 6.0);
749 EXPECT_EQ(pointer_events[3].buttons, kFlutterPointerButtonMousePrimary);
750 EXPECT_EQ(pointer_events[3].view_id, 42);
751 EXPECT_EQ(pointer_events[4].timestamp, 1237000u);
752 EXPECT_EQ(pointer_events[4].x, 7.0);
753 EXPECT_EQ(pointer_events[4].y, 8.0);
754 EXPECT_EQ(pointer_events[4].buttons, 0);
755 EXPECT_EQ(pointer_events[4].view_id, 42);
756 EXPECT_EQ(pointer_events[5].timestamp, 1238000u);
757 EXPECT_EQ(pointer_events[5].x, 9.0);
758 EXPECT_EQ(pointer_events[5].y, 10.0);
759 EXPECT_EQ(pointer_events[5].buttons, 0);
760 EXPECT_EQ(pointer_events[5].view_id, 42);
761}
762
763TEST(FlPointerManagerTest, DeviceKind) {
764 g_autoptr(FlDartProject) project = fl_dart_project_new();
765 g_autoptr(FlEngine) engine = fl_engine_new(project);
766
767 g_autoptr(GError) error = nullptr;
768 EXPECT_TRUE(fl_engine_start(engine, &error));
769 EXPECT_EQ(error, nullptr);
770
771 std::vector<FlutterPointerEvent> pointer_events;
773 SendPointerEvent,
774 ([&pointer_events](auto engine, const FlutterPointerEvent* events,
775 size_t events_count) {
776 for (size_t i = 0; i < events_count; i++) {
777 pointer_events.push_back(events[i]);
778 }
779
780 return kSuccess;
781 }));
782
783 g_autoptr(FlPointerManager) manager = fl_pointer_manager_new(42, engine);
788 2.0, GDK_BUTTON_PRIMARY);
793 3.0, 4.0, GDK_BUTTON_PRIMARY);
796
797 EXPECT_EQ(pointer_events.size(), 5u);
798
799 EXPECT_EQ(pointer_events[0].device_kind, kFlutterPointerDeviceKindTrackpad);
800 EXPECT_EQ(pointer_events[1].device_kind, kFlutterPointerDeviceKindTrackpad);
801 EXPECT_EQ(pointer_events[2].device_kind, kFlutterPointerDeviceKindTrackpad);
802 EXPECT_EQ(pointer_events[3].device_kind, kFlutterPointerDeviceKindTrackpad);
803 EXPECT_EQ(pointer_events[4].device_kind, kFlutterPointerDeviceKindTrackpad);
804}
int32_t x
@ kFlutterPointerButtonMousePrimary
Definition embedder.h:1289
@ kFlutterPointerButtonMouseMiddle
Definition embedder.h:1291
@ kFlutterPointerButtonMouseForward
Definition embedder.h:1293
@ kFlutterPointerButtonMouseBack
Definition embedder.h:1292
@ kFlutterPointerButtonMouseSecondary
Definition embedder.h:1290
@ kSuccess
Definition embedder.h:73
@ kFlutterPointerDeviceKindTrackpad
Definition embedder.h:1283
@ kFlutterPointerDeviceKindMouse
Definition embedder.h:1280
FlutterEngine engine
Definition main.cc:84
g_autoptr(GMutexLocker) locker
G_MODULE_EXPORT FlDartProject * fl_dart_project_new()
G_MODULE_EXPORT FlEngine * fl_engine_new(FlDartProject *project)
Definition fl_engine.cc:697
FlutterEngineProcTable * fl_engine_get_embedder_api(FlEngine *self)
Definition fl_engine.cc:868
gboolean fl_engine_start(FlEngine *self, GError **error)
Definition fl_engine.cc:726
const uint8_t uint32_t uint32_t GError ** error
gboolean fl_pointer_manager_handle_button_press(FlPointerManager *self, guint event_time, FlutterPointerDeviceKind device_kind, gdouble x, gdouble y, guint gdk_button)
FlPointerManager * fl_pointer_manager_new(FlutterViewId view_id, FlEngine *engine)
gboolean fl_pointer_manager_handle_motion(FlPointerManager *self, guint event_time, FlutterPointerDeviceKind device_kind, gdouble x, gdouble y)
gboolean fl_pointer_manager_handle_enter(FlPointerManager *self, guint event_time, FlutterPointerDeviceKind device_kind, gdouble x, gdouble y)
gboolean fl_pointer_manager_handle_leave(FlPointerManager *self, guint event_time, FlutterPointerDeviceKind device_kind, gdouble x, gdouble y)
gboolean fl_pointer_manager_handle_button_release(FlPointerManager *self, guint event_time, FlutterPointerDeviceKind device_kind, gdouble x, gdouble y, guint gdk_button)
TEST(FlPointerManagerTest, EnterLeave)
G_BEGIN_DECLS FlutterViewId view_id
double y
#define MOCK_ENGINE_PROC(proc, mock_impl)
FlutterEngineSendPointerEventFnPtr SendPointerEvent
Definition embedder.h:3716