6 #include "flutter/shell/platform/linux/testing/linux_test.h"
7 #include "gtest/gtest.h"
9 #include "flutter/shell/platform/embedder/test_utils/proc_table_replacement.h"
14 #include "flutter/shell/platform/linux/testing/mock_renderable.h"
28 ([&called](
auto engine, FlutterEngineDisplaysUpdateType update_type,
29 const FlutterEngineDisplay* displays,
size_t displays_length) {
31 EXPECT_EQ(update_type, kFlutterEngineDisplaysUpdateTypeStartup);
32 EXPECT_EQ(displays_length, 2u);
34 EXPECT_EQ(displays[0].display_id, 1u);
35 EXPECT_EQ(displays[0].refresh_rate, 60);
36 EXPECT_EQ(displays[0].
width, 1024u);
37 EXPECT_EQ(displays[0].
height, 768u);
38 EXPECT_EQ(displays[0].device_pixel_ratio, 1.0);
40 EXPECT_EQ(displays[1].display_id, 2u);
41 EXPECT_EQ(displays[1].refresh_rate, 120);
42 EXPECT_EQ(displays[1].
width, 3840u);
43 EXPECT_EQ(displays[1].
height, 2160u);
44 EXPECT_EQ(displays[1].device_pixel_ratio, 2.0);
49 FlutterEngineDisplay displays[2] = {
51 .struct_size =
sizeof(FlutterEngineDisplay),
53 .single_display =
false,
57 .device_pixel_ratio = 1.0,
60 .struct_size =
sizeof(FlutterEngineDisplay),
62 .single_display =
false,
63 .refresh_rate = 120.0,
66 .device_pixel_ratio = 2.0,
79 SendWindowMetricsEvent,
80 ([&called](
auto engine,
const FlutterWindowMetricsEvent* event) {
82 EXPECT_EQ(event->display_id, 99u);
83 EXPECT_EQ(event->view_id, 1);
84 EXPECT_EQ(event->width, 800u);
85 EXPECT_EQ(event->height, 600u);
86 EXPECT_TRUE(event->has_constraints);
87 EXPECT_EQ(event->min_width_constraint, 800u);
88 EXPECT_EQ(event->min_height_constraint, 600u);
89 EXPECT_EQ(event->max_width_constraint, 3840u);
90 EXPECT_EQ(event->max_height_constraint, 2160u);
91 EXPECT_EQ(event->pixel_ratio, 2.0);
106 ([&called](
auto engine,
const FlutterPointerEvent* events,
107 size_t events_count) {
109 EXPECT_EQ(events_count,
static_cast<size_t>(1));
110 EXPECT_EQ(events[0].
view_id, 1);
111 EXPECT_EQ(events[0].phase, kDown);
112 EXPECT_EQ(events[0].timestamp,
static_cast<size_t>(1234567890));
113 EXPECT_EQ(events[0].
x, 800);
114 EXPECT_EQ(events[0].
y, 600);
115 EXPECT_EQ(events[0].device,
static_cast<int32_t
>(0));
116 EXPECT_EQ(events[0].signal_kind, kFlutterPointerSignalKindScroll);
117 EXPECT_EQ(events[0].scroll_delta_x, 1.2);
118 EXPECT_EQ(events[0].scroll_delta_y, -3.4);
119 EXPECT_EQ(events[0].device_kind, kFlutterPointerDeviceKindMouse);
120 EXPECT_EQ(events[0].buttons, kFlutterPointerButtonMouseSecondary);
127 kFlutterPointerDeviceKindMouse, 1.2, -3.4,
128 kFlutterPointerButtonMouseSecondary, 0, 0);
135 bool device_state_sent =
false;
138 ([&device_state_sent](
auto engine,
const FlutterPointerEvent* events,
139 size_t events_count) {
140 device_state_sent =
true;
141 EXPECT_EQ(events_count,
static_cast<size_t>(1));
142 EXPECT_DOUBLE_EQ(events[0].pressure, 0.5);
143 EXPECT_DOUBLE_EQ(events[0].pressure_min, 0.0);
144 EXPECT_DOUBLE_EQ(events[0].pressure_max, 1.0);
145 EXPECT_DOUBLE_EQ(events[0].rotation, G_PI / 2.0);
152 engine, 1, kDown, 1234567890, 800, 600, kFlutterPointerDeviceKindMouse,
153 1.2, -3.4, kFlutterPointerButtonMouseSecondary, 90.0, 0.5);
155 EXPECT_TRUE(device_state_sent);
163 ([&called](
auto engine,
const FlutterPointerEvent* events,
164 size_t events_count) {
166 EXPECT_EQ(events_count,
static_cast<size_t>(1));
167 EXPECT_EQ(events[0].
view_id, 1);
168 EXPECT_EQ(events[0].phase, kPanZoomUpdate);
169 EXPECT_EQ(events[0].timestamp,
static_cast<size_t>(1234567890));
170 EXPECT_EQ(events[0].
x, 800);
171 EXPECT_EQ(events[0].
y, 600);
172 EXPECT_EQ(events[0].device,
static_cast<int32_t
>(1));
173 EXPECT_EQ(events[0].signal_kind, kFlutterPointerSignalKindNone);
174 EXPECT_EQ(events[0].pan_x, 1.5);
175 EXPECT_EQ(events[0].pan_y, 2.5);
176 EXPECT_EQ(events[0].scale, 3.5);
177 EXPECT_EQ(events[0].rotation, 4.5);
178 EXPECT_EQ(events[0].device_kind, kFlutterPointerDeviceKindTrackpad);
179 EXPECT_EQ(events[0].buttons, 0);
186 kPanZoomUpdate, 1.5, 2.5, 3.5, 4.5);
196 ([&called](
auto engine,
const FlutterSendSemanticsActionInfo* info) {
197 EXPECT_EQ(info->view_id,
static_cast<int64_t
>(456));
198 EXPECT_EQ(info->node_id,
static_cast<uint64_t
>(42));
199 EXPECT_EQ(info->action, kFlutterSemanticsActionTap);
200 EXPECT_EQ(info->data_length,
static_cast<size_t>(4));
201 EXPECT_EQ(info->data[0],
't');
202 EXPECT_EQ(info->data[1],
'e');
203 EXPECT_EQ(info->data[2],
's');
204 EXPECT_EQ(info->data[3],
't');
211 g_autoptr(GBytes) data = g_bytes_new_static(
"test", 4);
213 kFlutterSemanticsActionTap, data);
221 FlutterEngineSendPlatformMessageFnPtr old_handler =
225 ([&called, old_handler](
auto engine,
226 const FlutterPlatformMessage*
message) {
227 if (strcmp(
message->channel,
"test") != 0) {
228 return old_handler(engine, message);
233 EXPECT_EQ(
message->message_size,
static_cast<size_t>(4));
234 EXPECT_EQ(
message->message[0],
't');
235 EXPECT_EQ(
message->message[1],
'e');
236 EXPECT_EQ(
message->message[2],
's');
237 EXPECT_EQ(
message->message[3],
't');
255 SendPlatformMessageResponse,
256 ([&called](
auto engine,
257 const FlutterPlatformMessageResponseHandle* handle,
258 const uint8_t* data,
size_t data_length) {
263 reinterpret_cast<const FlutterPlatformMessageResponseHandle*
>(
265 EXPECT_EQ(data_length,
static_cast<size_t>(4));
266 EXPECT_EQ(data[0],
't');
267 EXPECT_EQ(data[1],
'e');
268 EXPECT_EQ(data[2],
's');
269 EXPECT_EQ(data[3],
't');
276 g_autoptr(GBytes) response = g_bytes_new_static(
"test", 4);
278 engine,
reinterpret_cast<const FlutterPlatformMessageResponseHandle*
>(42),
280 EXPECT_EQ(
error,
nullptr);
290 ([&called](
auto engine,
const FlutterPlatformMessage*
message) {
293 EXPECT_STREQ(
message->channel,
"flutter/settings");
300 FL_MESSAGE_CODEC(codec), data, &
error);
301 EXPECT_NE(settings,
nullptr);
302 EXPECT_EQ(
error,
nullptr);
306 EXPECT_NE(text_scale_factor,
nullptr);
309 FlValue* always_use_24hr_format =
311 EXPECT_NE(always_use_24hr_format,
nullptr);
317 EXPECT_NE(platform_brightness,
nullptr);
329 int* count =
reinterpret_cast<int*
>(
user_data);
335 OnPreEngineRestartCallback callback;
336 void* callback_user_data;
340 Initialize, ([&callback, &callback_user_data, &called](
341 size_t version,
const FlutterRendererConfig* config,
343 FLUTTER_API_SYMBOL(FlutterEngine) * engine_out) {
345 callback =
args->on_pre_engine_restart_callback;
351 MOCK_ENGINE_PROC(RunInitialized, ([](
auto engine) {
return kSuccess; }));
356 EXPECT_NE(callback,
nullptr);
359 callback(callback_user_data);
367 g_signal_connect(engine,
"on-pre-engine-restart",
370 callback(callback_user_data);
375 GPtrArray* args_array = g_ptr_array_new();
376 g_ptr_array_add(args_array,
const_cast<char*
>(
"arg_one"));
377 g_ptr_array_add(args_array,
const_cast<char*
>(
"arg_two"));
378 g_ptr_array_add(args_array,
const_cast<char*
>(
"arg_three"));
379 g_ptr_array_add(args_array,
nullptr);
380 gchar**
args =
reinterpret_cast<gchar**
>(g_ptr_array_free(args_array,
false));
386 Initialize, ([&called, &set_args =
args](
387 size_t version,
const FlutterRendererConfig* config,
389 FLUTTER_API_SYMBOL(FlutterEngine) * engine_out) {
391 EXPECT_NE(set_args,
args->dart_entrypoint_argv);
392 EXPECT_EQ(
args->dart_entrypoint_argc, 3);
397 MOCK_ENGINE_PROC(RunInitialized, ([](
auto engine) {
return kSuccess; }));
408 ([&engine_id](
size_t version,
const FlutterRendererConfig* config,
410 FLUTTER_API_SYMBOL(FlutterEngine) * engine_out) {
411 engine_id =
args->engine_id;
415 MOCK_ENGINE_PROC(RunInitialized, ([](
auto engine) {
return kSuccess; }));
418 EXPECT_TRUE(engine_id != 0);
426 bool same_task_runner =
false;
430 ([&same_task_runner](
size_t version,
const FlutterRendererConfig* config,
432 FLUTTER_API_SYMBOL(FlutterEngine) * engine_out) {
433 same_task_runner =
args->custom_task_runners->platform_task_runner ==
434 args->custom_task_runners->ui_task_runner;
438 MOCK_ENGINE_PROC(RunInitialized, ([](
auto engine) {
return kSuccess; }));
441 EXPECT_TRUE(same_task_runner);
448 bool same_task_runner =
false;
452 ([&same_task_runner](
size_t version,
const FlutterRendererConfig* config,
454 FLUTTER_API_SYMBOL(FlutterEngine) * engine_out) {
455 same_task_runner =
args->custom_task_runners->platform_task_runner ==
456 args->custom_task_runners->ui_task_runner;
460 MOCK_ENGINE_PROC(RunInitialized, ([](
auto engine) {
return kSuccess; }));
463 EXPECT_TRUE(same_task_runner);
470 bool separate_thread =
false;
474 ([&separate_thread](
size_t version,
const FlutterRendererConfig* config,
476 FLUTTER_API_SYMBOL(FlutterEngine) * engine_out) {
477 separate_thread =
args->custom_task_runners->ui_task_runner ==
nullptr;
481 MOCK_ENGINE_PROC(RunInitialized, ([](
auto engine) {
return kSuccess; }));
484 EXPECT_TRUE(separate_thread);
488 g_autofree gchar* initial_language = g_strdup(g_getenv(
"LANGUAGE"));
489 g_setenv(
"LANGUAGE",
"de:en_US",
TRUE);
493 UpdateLocales, ([&called](
auto engine,
const FlutterLocale** locales,
494 size_t locales_count) {
497 EXPECT_EQ(locales_count,
static_cast<size_t>(4));
499 EXPECT_STREQ(locales[0]->language_code,
"de");
500 EXPECT_STREQ(locales[0]->country_code,
nullptr);
501 EXPECT_STREQ(locales[0]->script_code,
nullptr);
502 EXPECT_STREQ(locales[0]->variant_code,
nullptr);
504 EXPECT_STREQ(locales[1]->language_code,
"en");
505 EXPECT_STREQ(locales[1]->country_code,
"US");
506 EXPECT_STREQ(locales[1]->script_code,
nullptr);
507 EXPECT_STREQ(locales[1]->variant_code,
nullptr);
509 EXPECT_STREQ(locales[2]->language_code,
"en");
510 EXPECT_STREQ(locales[2]->country_code,
nullptr);
511 EXPECT_STREQ(locales[2]->script_code,
nullptr);
512 EXPECT_STREQ(locales[2]->variant_code,
nullptr);
514 EXPECT_STREQ(locales[3]->language_code,
"C");
515 EXPECT_STREQ(locales[3]->country_code,
nullptr);
516 EXPECT_STREQ(locales[3]->script_code,
nullptr);
517 EXPECT_STREQ(locales[3]->variant_code,
nullptr);
526 if (initial_language) {
527 g_setenv(
"LANGUAGE", initial_language,
TRUE);
529 g_unsetenv(
"LANGUAGE");
534 g_autofree gchar* initial_language = g_strdup(g_getenv(
"LANGUAGE"));
535 g_setenv(
"LANGUAGE",
"C",
TRUE);
539 UpdateLocales, ([&called](
auto engine,
const FlutterLocale** locales,
540 size_t locales_count) {
543 EXPECT_EQ(locales_count,
static_cast<size_t>(1));
545 EXPECT_STREQ(locales[0]->language_code,
"C");
546 EXPECT_STREQ(locales[0]->country_code,
nullptr);
547 EXPECT_STREQ(locales[0]->script_code,
nullptr);
548 EXPECT_STREQ(locales[0]->variant_code,
nullptr);
557 if (initial_language) {
558 g_setenv(
"LANGUAGE", initial_language,
TRUE);
560 g_unsetenv(
"LANGUAGE");
565 g_autofree gchar* initial_language = g_strdup(g_getenv(
"LANGUAGE"));
566 g_setenv(
"LANGUAGE",
"en:en",
TRUE);
570 UpdateLocales, ([&called](
auto engine,
const FlutterLocale** locales,
571 size_t locales_count) {
574 EXPECT_EQ(locales_count,
static_cast<size_t>(2));
576 EXPECT_STREQ(locales[0]->language_code,
"en");
577 EXPECT_STREQ(locales[0]->country_code,
nullptr);
578 EXPECT_STREQ(locales[0]->script_code,
nullptr);
579 EXPECT_STREQ(locales[0]->variant_code,
nullptr);
581 EXPECT_STREQ(locales[1]->language_code,
"C");
582 EXPECT_STREQ(locales[1]->country_code,
nullptr);
583 EXPECT_STREQ(locales[1]->script_code,
nullptr);
584 EXPECT_STREQ(locales[1]->variant_code,
nullptr);
593 if (initial_language) {
594 g_setenv(
"LANGUAGE", initial_language,
TRUE);
596 g_unsetenv(
"LANGUAGE");
601 g_autofree gchar* initial_language = g_strdup(g_getenv(
"LANGUAGE"));
602 g_setenv(
"LANGUAGE",
"de:: :en_US",
TRUE);
606 UpdateLocales, ([&called](
auto engine,
const FlutterLocale** locales,
607 size_t locales_count) {
610 EXPECT_EQ(locales_count,
static_cast<size_t>(4));
612 EXPECT_STREQ(locales[0]->language_code,
"de");
613 EXPECT_STREQ(locales[0]->country_code,
nullptr);
614 EXPECT_STREQ(locales[0]->script_code,
nullptr);
615 EXPECT_STREQ(locales[0]->variant_code,
nullptr);
617 EXPECT_STREQ(locales[1]->language_code,
"en");
618 EXPECT_STREQ(locales[1]->country_code,
"US");
619 EXPECT_STREQ(locales[1]->script_code,
nullptr);
620 EXPECT_STREQ(locales[1]->variant_code,
nullptr);
622 EXPECT_STREQ(locales[2]->language_code,
"en");
623 EXPECT_STREQ(locales[2]->country_code,
nullptr);
624 EXPECT_STREQ(locales[2]->script_code,
nullptr);
625 EXPECT_STREQ(locales[2]->variant_code,
nullptr);
627 EXPECT_STREQ(locales[3]->language_code,
"C");
628 EXPECT_STREQ(locales[3]->country_code,
nullptr);
629 EXPECT_STREQ(locales[3]->script_code,
nullptr);
630 EXPECT_STREQ(locales[3]->variant_code,
nullptr);
639 if (initial_language) {
640 g_setenv(
"LANGUAGE", initial_language,
TRUE);
642 g_unsetenv(
"LANGUAGE");
647 GAsyncResult* result,
652 EXPECT_EQ(
error,
nullptr);
654 g_main_loop_quit(
static_cast<GMainLoop*
>(
user_data));
660 AddView, ([&called](
auto engine,
const FlutterAddViewInfo* info) {
662 EXPECT_EQ(info->view_metrics->width, 123u);
663 EXPECT_EQ(info->view_metrics->height, 456u);
664 EXPECT_TRUE(info->view_metrics->has_constraints);
665 EXPECT_EQ(info->view_metrics->min_width_constraint, 123u);
666 EXPECT_EQ(info->view_metrics->min_height_constraint, 456u);
667 EXPECT_EQ(info->view_metrics->max_width_constraint, 888u);
668 EXPECT_EQ(info->view_metrics->max_height_constraint, 999u);
669 EXPECT_EQ(info->view_metrics->pixel_ratio, 2.0);
671 FlutterAddViewResult result;
672 result.struct_size =
sizeof(FlutterAddViewResult);
674 result.user_data = info->user_data;
675 info->add_view_callback(&result);
688 g_main_loop_run(loop);
692 GAsyncResult* result,
697 EXPECT_NE(
error,
nullptr);
699 g_main_loop_quit(
static_cast<GMainLoop*
>(
user_data));
704 AddView, ([](
auto engine,
const FlutterAddViewInfo* info) {
705 FlutterAddViewResult result;
706 result.struct_size =
sizeof(FlutterAddViewResult);
707 result.added =
false;
708 result.user_data = info->user_data;
709 info->add_view_callback(&result);
721 g_main_loop_run(loop);
725 GAsyncResult* result,
730 EXPECT_NE(
error,
nullptr);
732 g_main_loop_quit(
static_cast<GMainLoop*
>(
user_data));
737 AddView, ([](
auto engine,
const FlutterAddViewInfo* info) {
738 return kInvalidArguments;
748 g_main_loop_run(loop);
752 GAsyncResult* result,
757 EXPECT_EQ(
error,
nullptr);
759 g_main_loop_quit(
static_cast<GMainLoop*
>(
user_data));
765 RemoveView, ([&called](
auto engine,
const FlutterRemoveViewInfo* info) {
767 EXPECT_EQ(info->view_id, 123);
769 FlutterRemoveViewResult result;
770 result.struct_size =
sizeof(FlutterRemoveViewResult);
771 result.removed =
true;
772 result.user_data = info->user_data;
773 info->remove_view_callback(&result);
782 g_main_loop_run(loop);
786 GAsyncResult* result,
791 EXPECT_NE(
error,
nullptr);
793 g_main_loop_quit(
static_cast<GMainLoop*
>(
user_data));
798 RemoveView, ([](
auto engine,
const FlutterRemoveViewInfo* info) {
799 FlutterRemoveViewResult result;
800 result.struct_size =
sizeof(FlutterRemoveViewResult);
801 result.removed =
false;
802 result.user_data = info->user_data;
803 info->remove_view_callback(&result);
811 g_main_loop_run(loop);
815 GAsyncResult* result,
820 EXPECT_NE(
error,
nullptr);
822 g_main_loop_quit(
static_cast<GMainLoop*
>(
user_data));
827 RemoveView, ([](
auto engine,
const FlutterRemoveViewInfo* info) {
828 return kInvalidArguments;
835 g_main_loop_run(loop);
844 ([&called](
auto engine,
const FlutterKeyEvent* event,
845 FlutterKeyEventCallback callback,
void*
user_data) {
847 EXPECT_EQ(event->timestamp, 1234);
848 EXPECT_EQ(event->type, kFlutterKeyEventTypeUp);
849 EXPECT_EQ(event->physical,
static_cast<uint64_t
>(42));
850 EXPECT_EQ(event->logical,
static_cast<uint64_t
>(123));
851 EXPECT_TRUE(event->synthesized);
852 EXPECT_EQ(event->device_type, kFlutterKeyEventDeviceTypeKeyboard);
857 FlutterKeyEvent
event = {.struct_size =
sizeof(FlutterKeyEvent),
859 .
type = kFlutterKeyEventTypeUp,
862 .character =
nullptr,
864 .device_type = kFlutterKeyEventDeviceTypeKeyboard};
866 engine, &event,
nullptr,
867 [](GObject*
object, GAsyncResult* result, gpointer
user_data) {
872 EXPECT_EQ(
error,
nullptr);
873 EXPECT_TRUE(handled);
874 g_main_loop_quit(
static_cast<GMainLoop*
>(
user_data));
878 g_main_loop_run(loop);
888 ([&called](
auto engine,
const FlutterKeyEvent* event,
889 FlutterKeyEventCallback callback,
void*
user_data) {
895 FlutterKeyEvent
event = {.struct_size =
sizeof(FlutterKeyEvent),
897 .
type = kFlutterKeyEventTypeUp,
900 .character =
nullptr,
902 .device_type = kFlutterKeyEventDeviceTypeKeyboard};
904 engine, &event,
nullptr,
905 [](GObject*
object, GAsyncResult* result, gpointer
user_data) {
910 EXPECT_EQ(
error,
nullptr);
911 EXPECT_FALSE(handled);
912 g_main_loop_quit(
static_cast<GMainLoop*
>(
user_data));
916 g_main_loop_run(loop);
928 ([&called](
auto engine,
const FlutterKeyEvent* event,
929 FlutterKeyEventCallback callback,
void*
user_data) {
931 return kInvalidArguments;
934 FlutterKeyEvent
event = {.struct_size =
sizeof(FlutterKeyEvent),
936 .
type = kFlutterKeyEventTypeUp,
939 .character =
nullptr,
941 .device_type = kFlutterKeyEventDeviceTypeKeyboard};
943 engine, &event,
nullptr,
944 [](GObject*
object, GAsyncResult* result, gpointer
user_data) {
949 EXPECT_NE(
error,
nullptr);
950 EXPECT_STREQ(
error->message,
"Failed to send key event");
951 g_main_loop_quit(
static_cast<GMainLoop*
>(
user_data));
955 g_main_loop_run(loop);
963 ([&called](
size_t version,
const FlutterRendererConfig* config,
965 FLUTTER_API_SYMBOL(FlutterEngine) * engine_out) {
967 bool has_impeller_switch =
false;
968 for (
int i = 0;
i <
args->command_line_argc;
i++) {
969 if (strcmp(
args->command_line_argv[
i],
"--enable-impeller") == 0) {
970 has_impeller_switch = true;
973 EXPECT_TRUE(has_impeller_switch);
977 MOCK_ENGINE_PROC(RunInitialized, ([](
auto engine) {
return kSuccess; }));
989 ([&called](
size_t version,
const FlutterRendererConfig* config,
991 FLUTTER_API_SYMBOL(FlutterEngine) * engine_out) {
993 bool has_impeller_switch =
false;
994 for (
int i = 0;
i <
args->command_line_argc;
i++) {
995 if (strcmp(
args->command_line_argv[
i],
"--enable-impeller") == 0) {
996 has_impeller_switch = true;
999 EXPECT_FALSE(has_impeller_switch);
1003 MOCK_ENGINE_PROC(RunInitialized, ([](
auto engine) {
return kSuccess; }));
1007 EXPECT_EQ(
error,
nullptr);
1008 EXPECT_TRUE(called);
g_autoptr(FlEngine) engine
FlRenderable * renderable
const char FlTextDirection FlAssertiveness gpointer user_data
FlFramebuffer double double int int height
FlFramebuffer double double int width
FlFramebuffer double double y
G_MODULE_EXPORT void fl_dart_project_set_enable_impeller(FlDartProject *project, gboolean enable_impeller)
G_MODULE_EXPORT void fl_dart_project_set_ui_thread_policy(FlDartProject *project, FlUIThreadPolicy policy)
G_MODULE_EXPORT void fl_dart_project_set_dart_entrypoint_arguments(FlDartProject *self, char **argv)
@ FL_UI_THREAD_POLICY_RUN_ON_PLATFORM_THREAD
@ FL_UI_THREAD_POLICY_RUN_ON_SEPARATE_THREAD
@ FL_UI_THREAD_POLICY_DEFAULT
FlMouseCursorHandler * fl_engine_get_mouse_cursor_handler(FlEngine *self)
void fl_engine_send_mouse_pointer_event(FlEngine *self, FlutterViewId view_id, FlutterPointerPhase phase, size_t timestamp, double x, double y, FlutterPointerDeviceKind device_kind, double scroll_delta_x, double scroll_delta_y, int64_t buttons, double rotation, double pressure)
gboolean fl_engine_send_key_event_finish(FlEngine *self, GAsyncResult *result, gboolean *handled, GError **error)
FlutterEngineProcTable * fl_engine_get_embedder_api(FlEngine *self)
void fl_engine_dispatch_semantics_action(FlEngine *self, FlutterViewId view_id, uint64_t node_id, FlutterSemanticsAction action, GBytes *data)
void fl_engine_send_window_metrics_event(FlEngine *self, FlutterEngineDisplayId display_id, FlutterViewId view_id, size_t min_width, size_t min_height, size_t max_width, size_t max_height, double pixel_ratio)
void fl_engine_notify_display_update(FlEngine *self, const FlutterEngineDisplay *displays, size_t displays_length)
gboolean fl_engine_remove_view_finish(FlEngine *self, GAsyncResult *result, GError **error)
FlTaskRunner * fl_engine_get_task_runner(FlEngine *self)
FlKeyboardManager * fl_engine_get_keyboard_manager(FlEngine *self)
FlDisplayMonitor * fl_engine_get_display_monitor(FlEngine *self)
gboolean fl_engine_send_platform_message_response(FlEngine *self, const FlutterPlatformMessageResponseHandle *handle, GBytes *response, GError **error)
FlutterViewId fl_engine_add_view(FlEngine *self, FlRenderable *renderable, size_t min_width, size_t min_height, size_t max_width, size_t max_height, double pixel_ratio, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
void fl_engine_send_platform_message(FlEngine *self, const gchar *channel, GBytes *message, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
FlEngine * fl_engine_for_id(int64_t id)
void fl_engine_remove_view(FlEngine *self, FlutterViewId view_id, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
G_MODULE_EXPORT FlBinaryMessenger * fl_engine_get_binary_messenger(FlEngine *self)
gboolean fl_engine_add_view_finish(FlEngine *self, GAsyncResult *result, GError **error)
void fl_engine_send_key_event(FlEngine *self, const FlutterKeyEvent *event, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
void fl_engine_send_pointer_pan_zoom_event(FlEngine *self, FlutterViewId view_id, size_t timestamp, double x, double y, FlutterPointerPhase phase, double pan_x, double pan_y, double scale, double rotation)
gboolean fl_engine_start(FlEngine *self, GError **error)
void on_pre_engine_restart_cb(FlEngine *engine, gpointer user_data)
static void remove_view_engine_error_cb(GObject *object, GAsyncResult *result, gpointer user_data)
static void remove_view_cb(GObject *object, GAsyncResult *result, gpointer user_data)
static void add_view_error_cb(GObject *object, GAsyncResult *result, gpointer user_data)
static void add_view_engine_error_cb(GObject *object, GAsyncResult *result, gpointer user_data)
static void remove_view_error_cb(GObject *object, GAsyncResult *result, gpointer user_data)
static void add_view_cb(GObject *object, GAsyncResult *result, gpointer user_data)
TEST_F(FlEngineTest, NotifyDisplayUpdate)
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args
G_MODULE_EXPORT FlJsonMessageCodec * fl_json_message_codec_new()
G_MODULE_EXPORT FlValue * fl_message_codec_decode_message(FlMessageCodec *self, GBytes *message, GError **error)
const uint8_t uint32_t uint32_t GError ** error
G_MODULE_EXPORT FlValue * fl_value_lookup_string(FlValue *self, const gchar *key)
G_MODULE_EXPORT FlValueType fl_value_get_type(FlValue *self)
typedefG_BEGIN_DECLS struct _FlValue FlValue
G_BEGIN_DECLS FlutterViewId view_id