112 FlPluginRegistryInterface* iface);
122 G_IMPLEMENT_INTERFACE(fl_plugin_registry_get_type(),
133 gchar* l = g_strdup(locale);
136 gchar* match = strrchr(l,
'@');
137 if (match !=
nullptr) {
138 if (modifier !=
nullptr) {
139 *modifier = g_strdup(match + 1);
142 }
else if (modifier !=
nullptr) {
146 match = strrchr(l,
'.');
147 if (match !=
nullptr) {
148 if (codeset !=
nullptr) {
149 *codeset = g_strdup(match + 1);
152 }
else if (codeset !=
nullptr) {
156 match = strrchr(l,
'_');
157 if (match !=
nullptr) {
158 if (territory !=
nullptr) {
159 *territory = g_strdup(match + 1);
162 }
else if (territory !=
nullptr) {
163 *territory =
nullptr;
166 if (language !=
nullptr) {
175 g_task_return_boolean(task,
TRUE);
186 g_task_return_boolean(task,
TRUE);
201 const gchar*
const* languages = g_get_language_names();
202 g_autoptr(GPtrArray) locales_array = g_ptr_array_new_with_free_func(
204 for (
int i = 0; languages[
i] !=
nullptr;
i++) {
205 g_autofree gchar* locale_string = g_strstrip(g_strdup(languages[
i]));
208 if (strcmp(locale_string,
"") == 0) {
212 g_autofree gchar* language =
nullptr;
213 g_autofree gchar* territory =
nullptr;
214 parse_locale(locale_string, &language, &territory,
nullptr,
nullptr);
218 gboolean has_locale = FALSE;
219 for (guint j = 0; !has_locale && j < locales_array->len; j++) {
221 reinterpret_cast<FlutterLocale*
>(g_ptr_array_index(locales_array, j));
222 has_locale = g_strcmp0(locale->
language_code, language) == 0 &&
231 g_ptr_array_add(locales_array, locale);
234 reinterpret_cast<const gchar*
>(g_steal_pointer(&language));
236 reinterpret_cast<const gchar*
>(g_steal_pointer(&territory));
246 g_warning(
"Failed to set up Flutter locales");
258 GLint sized_format = GL_RGBA8;
259 GLint general_format = GL_RGBA;
261 sized_format = GL_BGRA8_EXT;
262 general_format = GL_BGRA_EXT;
268 g_warning(
"Failed to create backing store");
304 uint8_t* allocation =
static_cast<uint8_t*
>(malloc(allocation_length));
305 if (allocation ==
nullptr) {
336 switch (
self->renderer_type) {
351 switch (
self->renderer_type) {
366 GWeakRef* ref =
static_cast<GWeakRef*
>(g_hash_table_lookup(
367 self->renderables_by_view_id, GINT_TO_POINTER(info->
view_id)));
368 if (ref ==
nullptr) {
371 g_autoptr(FlRenderable) renderable = FL_RENDERABLE(g_weak_ref_get(ref));
372 if (renderable ==
nullptr) {
383 return reinterpret_cast<void*
>(eglGetProcAddress(
name));
414 if (!
self->texture_registrar) {
421 g_warning(
"Unable to find texture %" G_GINT64_FORMAT,
texture_id);
427 if (FL_IS_TEXTURE_GL(
texture)) {
429 opengl_texture, &
error);
430 }
else if (FL_IS_PIXEL_BUFFER_TEXTURE(
texture)) {
435 g_warning(
"Unsupported texture type %" G_GINT64_FORMAT,
texture_id);
440 g_warning(
"%s",
error->message);
450 return self->thread == g_thread_self();
455 uint64_t target_time_nanos,
467 gboolean handled = FALSE;
468 if (
self->platform_message_handler !=
nullptr) {
471 handled =
self->platform_message_handler(
473 self->platform_message_handler_data);
491 g_clear_object(&
self->keyboard_manager);
494 g_clear_object(&
self->keyboard_handler);
495 self->keyboard_handler =
499 self->text_input_handler !=
nullptr
502 g_clear_object(&
self->text_input_handler);
504 if (widget !=
nullptr) {
528 g_task_return_pointer(task, g_bytes_new(
data, data_length),
529 reinterpret_cast<GDestroyNotify
>(g_bytes_unref));
534 FlPluginRegistry* registry,
536 FlEngine*
self = FL_ENGINE(registry);
539 self->texture_registrar);
543 FlPluginRegistryInterface* iface) {
551 FlEngine*
self = FL_ENGINE(
object);
553 case PROP_BINARY_MESSENGER:
554 g_set_object(&
self->binary_messenger,
555 FL_BINARY_MESSENGER(g_value_get_object(
value)));
558 G_OBJECT_WARN_INVALID_PROPERTY_ID(
object,
prop_id,
pspec);
564 FlEngine*
self = FL_ENGINE(
object);
566 if (
self->engine !=
nullptr) {
568 g_warning(
"Failed to shutdown Flutter engine");
570 self->engine =
nullptr;
573 if (
self->aot_data !=
nullptr) {
575 g_warning(
"Failed to send collect AOT data");
577 self->aot_data =
nullptr;
583 g_clear_object(&
self->project);
584 g_clear_object(&
self->display_monitor);
585 g_clear_object(&
self->opengl_manager);
586 g_clear_object(&
self->texture_registrar);
587 g_clear_object(&
self->binary_messenger);
588 g_clear_object(&
self->settings_handler);
589 g_clear_object(&
self->platform_handler);
590 g_clear_object(&
self->windowing_handler);
591 g_clear_object(&
self->keyboard_manager);
592 g_clear_object(&
self->text_input_handler);
593 g_clear_object(&
self->keyboard_handler);
594 g_clear_object(&
self->mouse_cursor_handler);
595 g_clear_object(&
self->task_runner);
596 g_clear_pointer(&
self->renderables_by_view_id, g_hash_table_unref);
598 if (
self->platform_message_handler_destroy_notify) {
599 self->platform_message_handler_destroy_notify(
600 self->platform_message_handler_data);
602 self->platform_message_handler_data =
nullptr;
603 self->platform_message_handler_destroy_notify =
nullptr;
605 G_OBJECT_CLASS(fl_engine_parent_class)->dispose(
object);
612 g_object_class_install_property(
613 G_OBJECT_CLASS(klass), PROP_BINARY_MESSENGER,
615 "binary-messenger",
"messenger",
"Binary messenger",
616 fl_binary_messenger_get_type(),
617 static_cast<GParamFlags
>(G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY |
618 G_PARAM_STATIC_STRINGS)));
621 "on-pre-engine-restart", fl_engine_get_type(), G_SIGNAL_RUN_LAST, 0,
622 nullptr,
nullptr,
nullptr, G_TYPE_NONE, 0);
624 "update-semantics", fl_engine_get_type(), G_SIGNAL_RUN_LAST, 0,
nullptr,
625 nullptr,
nullptr, G_TYPE_NONE, 1, G_TYPE_POINTER);
629 self->thread = g_thread_self();
633 g_warning(
"Failed get get engine function pointers");
638 self->display_monitor =
643 self->next_view_id = 1;
644 self->renderables_by_view_id = g_hash_table_new_full(
645 g_direct_hash, g_direct_equal,
nullptr, [](gpointer
value) {
646 GWeakRef* ref =
static_cast<GWeakRef*
>(
value);
647 g_weak_ref_clear(ref);
655 FlBinaryMessenger* binary_messenger) {
656 g_return_val_if_fail(FL_IS_DART_PROJECT(project),
nullptr);
658 FlEngine*
self = FL_ENGINE(g_object_new(fl_engine_get_type(),
nullptr));
660 self->project = FL_DART_PROJECT(g_object_ref(project));
661 const gchar* renderer = g_getenv(
"FLUTTER_LINUX_RENDERER");
662 if (g_strcmp0(renderer,
"software") == 0) {
665 "Using the software renderer. Not all features are supported. This is "
668 "To switch back to the default renderer, unset the "
669 "FLUTTER_LINUX_RENDERER environment variable.");
671 if (renderer !=
nullptr && strcmp(renderer,
"opengl") != 0) {
672 g_warning(
"Unknown renderer type '%s', defaulting to opengl", renderer);
677 if (binary_messenger !=
nullptr) {
678 self->binary_messenger =
679 FL_BINARY_MESSENGER(g_object_ref(binary_messenger));
684 self->mouse_cursor_handler =
692 void*
engine =
reinterpret_cast<void*
>(
id);
693 g_return_val_if_fail(FL_IS_ENGINE(
engine),
nullptr);
702 FlBinaryMessenger* binary_messenger) {
713 return self->renderer_type;
717 g_return_val_if_fail(FL_IS_ENGINE(
self),
nullptr);
718 return self->opengl_manager;
722 g_return_val_if_fail(FL_IS_ENGINE(
self),
nullptr);
723 return self->display_monitor;
727 g_return_val_if_fail(FL_IS_ENGINE(
self), FALSE);
731 switch (config.
type) {
737 [](
void*
user_data,
const void* allocation,
size_t row_bytes,
738 size_t height) {
return true; };
757 "Unsupported renderer type");
783 g_ptr_array_new_with_free_func(g_free);
784 g_ptr_array_insert(command_line_args, 0, g_strdup(
"flutter"));
786 g_ptr_array_add(command_line_args, g_strdup(env_switch.c_str()));
789 gchar** dart_entrypoint_args =
796 args.command_line_argc = command_line_args->len;
797 args.command_line_argv =
798 reinterpret_cast<const char* const*
>(command_line_args->pdata);
801 args.custom_task_runners = &custom_task_runners;
802 args.shutdown_dart_vm_when_done =
true;
804 args.dart_entrypoint_argc =
805 dart_entrypoint_args !=
nullptr ? g_strv_length(dart_entrypoint_args) : 0;
806 args.dart_entrypoint_argv =
807 reinterpret_cast<const char* const*
>(dart_entrypoint_args);
808 args.engine_id =
reinterpret_cast<int64_t
>(
self);
818 args.compositor = &compositor;
820 if (
self->embedder_api.RunsAOTCompiledDartCode()) {
824 if (
self->embedder_api.CreateAOTData(&source, &
self->aot_data) !=
827 "Failed to create AOT data");
837 "Failed to initialize Flutter engine");
841 result =
self->embedder_api.RunInitialized(
self->engine);
844 "Failed to run Flutter engine");
858 result =
self->embedder_api.UpdateSemanticsEnabled(
self->engine,
TRUE);
860 g_warning(
"Failed to enable accessibility features on Flutter engine");
869 return &(
self->embedder_api);
874 size_t displays_length) {
875 g_return_if_fail(FL_IS_ENGINE(
self));
881 g_warning(
"Failed to notify display update to Flutter engine: %d", result);
886 GWeakRef* ref = g_new(GWeakRef, 1);
887 g_weak_ref_init(ref, G_OBJECT(renderable));
893 FlRenderable* renderable,
897 GCancellable* cancellable,
900 g_return_val_if_fail(FL_IS_ENGINE(
self), -1);
905 self->next_view_id++;
907 GWeakRef* ref = g_new(GWeakRef, 1);
908 g_weak_ref_init(ref, G_OBJECT(renderable));
935 g_object_unref(task);
942 GAsyncResult* result,
944 g_return_val_if_fail(FL_IS_ENGINE(
self), FALSE);
945 return g_task_propagate_boolean(G_TASK(result),
error);
949 g_return_val_if_fail(FL_IS_ENGINE(
self),
nullptr);
951 GWeakRef* ref =
static_cast<GWeakRef*
>(g_hash_table_lookup(
952 self->renderables_by_view_id, GINT_TO_POINTER(
view_id)));
953 return FL_RENDERABLE(g_weak_ref_get(ref));
958 GCancellable* cancellable,
961 g_return_if_fail(FL_IS_ENGINE(
self));
963 g_hash_table_remove(
self->renderables_by_view_id, GINT_TO_POINTER(
view_id));
973 self->embedder_api.RemoveView(
self->engine, &info);
979 g_object_unref(task);
984 GAsyncResult* result,
986 g_return_val_if_fail(FL_IS_ENGINE(
self), FALSE);
987 return g_task_propagate_boolean(G_TASK(result),
error);
995 g_return_if_fail(FL_IS_ENGINE(
self));
996 g_return_if_fail(
handler !=
nullptr);
998 if (
self->platform_message_handler_destroy_notify) {
999 self->platform_message_handler_destroy_notify(
1000 self->platform_message_handler_data);
1014 g_return_val_if_fail(FL_IS_ENGINE(
self), FALSE);
1015 g_return_val_if_fail(handle !=
nullptr, FALSE);
1017 if (
self->engine ==
nullptr) {
1019 "No engine to send response to");
1023 gsize data_length = 0;
1024 const uint8_t*
data =
nullptr;
1025 if (response !=
nullptr) {
1027 static_cast<const uint8_t*
>(g_bytes_get_data(response, &data_length));
1030 self->engine, handle,
data, data_length);
1034 "Failed to send platform message response");
1044 GCancellable* cancellable,
1047 g_return_if_fail(FL_IS_ENGINE(
self));
1049 GTask* task =
nullptr;
1054 if (
self->engine ==
nullptr) {
1061 self->embedder_api.PlatformMessageCreateResponseHandle(
1067 "Failed to create response handle");
1068 g_object_unref(task);
1071 }
else if (
self->engine ==
nullptr) {
1080 ?
static_cast<const uint8_t*
>(g_bytes_get_data(
message,
nullptr))
1085 self->embedder_api.SendPlatformMessage(
self->engine, &fl_message);
1087 if (result !=
kSuccess && task !=
nullptr) {
1090 "Failed to send platform messages");
1091 g_object_unref(task);
1094 if (response_handle !=
nullptr) {
1095 if (
self->embedder_api.PlatformMessageReleaseResponseHandle(
1097 g_warning(
"Failed to release response handle");
1103 GAsyncResult* result,
1105 g_return_val_if_fail(FL_IS_ENGINE(
self), FALSE);
1106 g_return_val_if_fail(g_task_is_valid(result,
self), FALSE);
1108 return static_cast<GBytes*
>(g_task_propagate_pointer(G_TASK(result),
error));
1116 double pixel_ratio) {
1117 g_return_if_fail(FL_IS_ENGINE(
self));
1119 if (
self->engine ==
nullptr) {
1125 event.width =
width;
1127 event.pixel_ratio = pixel_ratio;
1128 event.display_id = display_id;
1130 if (
self->embedder_api.SendWindowMetricsEvent(
self->engine, &event) !=
1132 g_warning(
"Failed to send window metrics");
1143 double scroll_delta_x,
1144 double scroll_delta_y,
1146 g_return_if_fail(FL_IS_ENGINE(
self));
1148 if (
self->engine ==
nullptr) {
1154 fl_event.
phase = phase;
1158 if (scroll_delta_x != 0 || scroll_delta_y != 0) {
1167 if (
self->embedder_api.SendPointerEvent(
self->engine, &fl_event, 1) !=
1169 g_warning(
"Failed to send pointer event");
1179 g_return_if_fail(FL_IS_ENGINE(
self));
1181 if (
self->engine ==
nullptr) {
1194 event.struct_size =
sizeof(event);
1196 if (
self->embedder_api.SendPointerEvent(
self->engine, &event, 1) !=
1198 g_warning(
"Failed to send pointer event");
1208 g_return_if_fail(FL_IS_ENGINE(
self));
1210 if (
self->engine ==
nullptr) {
1223 event.struct_size =
sizeof(event);
1225 if (
self->embedder_api.SendPointerEvent(
self->engine, &event, 1) !=
1227 g_warning(
"Failed to send pointer event");
1237 g_return_if_fail(FL_IS_ENGINE(
self));
1239 if (
self->engine ==
nullptr) {
1252 event.struct_size =
sizeof(event);
1254 if (
self->embedder_api.SendPointerEvent(
self->engine, &event, 1) !=
1256 g_warning(
"Failed to send pointer event");
1266 g_return_if_fail(FL_IS_ENGINE(
self));
1268 if (
self->engine ==
nullptr) {
1281 event.struct_size =
sizeof(event);
1283 if (
self->embedder_api.SendPointerEvent(
self->engine, &event, 1) !=
1285 g_warning(
"Failed to send pointer event");
1295 g_return_if_fail(FL_IS_ENGINE(
self));
1297 if (
self->engine ==
nullptr) {
1310 event.struct_size =
sizeof(event);
1312 if (
self->embedder_api.SendPointerEvent(
self->engine, &event, 1) !=
1314 g_warning(
"Failed to send pointer event");
1328 g_return_if_fail(FL_IS_ENGINE(
self));
1330 if (
self->engine ==
nullptr) {
1339 fl_event.
phase = phase;
1340 fl_event.
pan_x = pan_x;
1341 fl_event.
pan_y = pan_y;
1342 fl_event.
scale = scale;
1347 if (
self->embedder_api.SendPointerEvent(
self->engine, &fl_event, 1) !=
1349 g_warning(
"Failed to send pointer event");
1355 gboolean* return_value = g_new0(gboolean, 1);
1356 *return_value = handled;
1357 g_task_return_pointer(task, return_value, g_free);
1362 GCancellable* cancellable,
1365 g_return_if_fail(FL_IS_ENGINE(
self));
1369 if (
self->engine ==
nullptr) {
1379 g_object_unref(task);
1384 GAsyncResult* result,
1387 g_return_val_if_fail(FL_IS_ENGINE(
self), FALSE);
1388 g_return_val_if_fail(g_task_is_valid(result,
self), FALSE);
1390 g_autofree gboolean* return_value =
1391 static_cast<gboolean*
>(g_task_propagate_pointer(G_TASK(result),
error));
1392 if (return_value ==
nullptr) {
1396 *handled = *return_value;
1405 g_return_if_fail(FL_IS_ENGINE(
self));
1407 if (
self->engine ==
nullptr) {
1411 const uint8_t* action_data =
nullptr;
1412 size_t action_data_length = 0;
1413 if (
data !=
nullptr) {
1414 action_data =
static_cast<const uint8_t*
>(
1415 g_bytes_get_data(
data, &action_data_length));
1423 info.
data = action_data;
1425 if (
self->embedder_api.SendSemanticsAction(
self->engine, &info) !=
kSuccess) {
1426 g_warning(
"Failed to send semantics action");
1432 g_return_val_if_fail(FL_IS_ENGINE(
self), FALSE);
1433 return self->embedder_api.MarkExternalTextureFrameAvailable(
1439 g_return_val_if_fail(FL_IS_ENGINE(
self), FALSE);
1446 g_return_val_if_fail(FL_IS_ENGINE(
self), FALSE);
1447 return self->embedder_api.UnregisterExternalTexture(
self->engine,
1453 g_return_val_if_fail(FL_IS_ENGINE(
self),
nullptr);
1454 return self->binary_messenger;
1458 g_return_val_if_fail(FL_IS_ENGINE(
self),
nullptr);
1459 return self->task_runner;
1463 g_return_if_fail(FL_IS_ENGINE(
self));
1465 g_warning(
"Failed to run task");
1471 g_return_val_if_fail(FL_IS_ENGINE(
self),
nullptr);
1472 return self->texture_registrar;
1476 g_return_if_fail(FL_IS_ENGINE(
self));
1478 if (
self->engine ==
nullptr) {
1482 if (
self->embedder_api.UpdateAccessibilityFeatures(
1485 g_warning(
"Failed to update accessibility features");
1490 g_return_if_fail(FL_IS_ENGINE(
self));
1495 g_return_val_if_fail(FL_IS_ENGINE(
self),
nullptr);
1496 return self->windowing_handler;
1500 g_return_val_if_fail(FL_IS_ENGINE(
self),
nullptr);
1501 return self->keyboard_manager;
1505 g_return_val_if_fail(FL_IS_ENGINE(
self),
nullptr);
1506 return self->text_input_handler;
1510 g_return_val_if_fail(FL_IS_ENGINE(
self),
nullptr);
1511 return self->mouse_cursor_handler;
FlutterEngineResult FlutterEngineGetProcAddresses(FlutterEngineProcTable *table)
Gets the table of engine function pointers.
uint64_t FlutterEngineDisplayId
@ kFlutterEngineAOTDataSourceTypeElfPath
FlutterPointerPhase
The phase of the pointer event.
@ kFlutterPointerButtonMousePrimary
FlutterAccessibilityFeature
@ kFlutterPointerSignalKindScroll
@ kFlutterEngineDisplaysUpdateTypeStartup
@ kFlutterOpenGLTargetTypeFramebuffer
@ kFlutterBackingStoreTypeSoftware
Specified an software allocation for Flutter to render into using the CPU.
@ kFlutterBackingStoreTypeOpenGL
#define FLUTTER_ENGINE_VERSION
FlutterPointerDeviceKind
The device type that created a pointer event.
@ kFlutterPointerDeviceKindTouch
@ kFlutterPointerDeviceKindTrackpad
g_signal_emit(self, fl_application_signals[SIGNAL_CREATE_WINDOW], 0, view, &window)
G_DEFINE_QUARK(fl_binary_messenger_codec_error_quark, fl_binary_messenger_codec_error) G_DECLARE_FINAL_TYPE(FlBinaryMessengerImpl
FlBinaryMessenger * fl_binary_messenger_new(FlEngine *engine)
void fl_binary_messenger_shutdown(FlBinaryMessenger *self)
g_autoptr(GMutexLocker) locker
G_MODULE_EXPORT const gchar * fl_dart_project_get_assets_path(FlDartProject *self)
G_MODULE_EXPORT const gchar * fl_dart_project_get_aot_library_path(FlDartProject *self)
G_MODULE_EXPORT const gchar * fl_dart_project_get_icu_data_path(FlDartProject *self)
G_MODULE_EXPORT gchar ** fl_dart_project_get_dart_entrypoint_arguments(FlDartProject *self)
G_MODULE_EXPORT FlDartProject * fl_dart_project_new()
G_MODULE_EXPORT FlUIThreadPolicy fl_dart_project_get_ui_thread_policy(FlDartProject *project)
@ FL_UI_THREAD_POLICY_RUN_ON_PLATFORM_THREAD
@ FL_UI_THREAD_POLICY_RUN_ON_SEPARATE_THREAD
@ FL_UI_THREAD_POLICY_DEFAULT
void fl_display_monitor_start(FlDisplayMonitor *self)
FlDisplayMonitor * fl_display_monitor_new(FlEngine *engine, GdkDisplay *display)
static bool fl_engine_gl_external_texture_frame_callback(void *user_data, int64_t texture_id, size_t width, size_t height, FlutterOpenGLTexture *opengl_texture)
static bool fl_engine_runs_task_on_current_thread(void *user_data)
FlTaskRunner * fl_engine_get_task_runner(FlEngine *self)
static void fl_engine_on_pre_engine_restart_cb(void *user_data)
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)
void fl_engine_set_platform_message_handler(FlEngine *self, FlEnginePlatformMessageHandler handler, gpointer user_data, GDestroyNotify destroy_notify)
G_DEFINE_TYPE_WITH_CODE(FlEngine, fl_engine, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE(fl_plugin_registry_get_type(), fl_engine_plugin_registry_iface_init)) enum
static void view_added_cb(const FlutterAddViewResult *result)
static bool compositor_create_backing_store_callback(const FlutterBackingStoreConfig *config, FlutterBackingStore *backing_store_out, void *user_data)
static bool fl_engine_gl_make_current(void *user_data)
gboolean fl_engine_send_key_event_finish(FlEngine *self, GAsyncResult *result, gboolean *handled, GError **error)
void fl_engine_dispatch_semantics_action(FlEngine *self, FlutterViewId view_id, uint64_t node_id, FlutterSemanticsAction action, GBytes *data)
static void parse_locale(const gchar *locale, gchar **language, gchar **territory, gchar **codeset, gchar **modifier)
static void * fl_engine_gl_proc_resolver(void *user_data, const char *name)
FlWindowingHandler * fl_engine_get_windowing_handler(FlEngine *self)
void fl_engine_send_touch_up_event(FlEngine *self, FlutterViewId view_id, size_t timestamp, double x, double y, int32_t device)
static FlEngine * fl_engine_new_full(FlDartProject *project, FlBinaryMessenger *binary_messenger)
FlEngine * fl_engine_new_with_binary_messenger(FlBinaryMessenger *binary_messenger)
void fl_engine_notify_display_update(FlEngine *self, const FlutterEngineDisplay *displays, size_t displays_length)
static bool collect_opengl_backing_store(FlEngine *self, const FlutterBackingStore *backing_store)
static bool compositor_present_view_callback(const FlutterPresentViewInfo *info)
void fl_engine_send_window_metrics_event(FlEngine *self, FlutterEngineDisplayId display_id, FlutterViewId view_id, size_t width, size_t height, double pixel_ratio)
static bool compositor_collect_backing_store_callback(const FlutterBackingStore *backing_store, void *user_data)
FlOpenGLManager * fl_engine_get_opengl_manager(FlEngine *self)
FlutterRendererType fl_engine_get_renderer_type(FlEngine *self)
FlMouseCursorHandler * fl_engine_get_mouse_cursor_handler(FlEngine *self)
static void fl_engine_dispose(GObject *object)
gboolean fl_engine_mark_texture_frame_available(FlEngine *self, int64_t texture_id)
static bool create_opengl_backing_store(FlEngine *self, const FlutterBackingStoreConfig *config, FlutterBackingStore *backing_store_out)
gboolean fl_engine_remove_view_finish(FlEngine *self, GAsyncResult *result, GError **error)
FlDisplayMonitor * fl_engine_get_display_monitor(FlEngine *self)
static FlPluginRegistrar * fl_engine_get_registrar_for_plugin(FlPluginRegistry *registry, const gchar *name)
static guint fl_engine_signals[LAST_SIGNAL]
static void fl_engine_platform_message_response_cb(const uint8_t *data, size_t data_length, void *user_data)
gboolean fl_engine_send_platform_message_response(FlEngine *self, const FlutterPlatformMessageResponseHandle *handle, GBytes *response, GError **error)
static void fl_engine_init(FlEngine *self)
static void fl_engine_post_task(FlutterTask task, uint64_t target_time_nanos, void *user_data)
void fl_engine_set_implicit_view(FlEngine *self, FlRenderable *renderable)
static uint32_t fl_engine_gl_get_fbo(void *user_data)
static void view_removed_cb(const FlutterRemoveViewResult *result)
gboolean fl_engine_unregister_external_texture(FlEngine *self, int64_t texture_id)
@ SIGNAL_UPDATE_SEMANTICS
@ SIGNAL_ON_PRE_ENGINE_RESTART
void fl_engine_send_platform_message(FlEngine *self, const gchar *channel, GBytes *message, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
gboolean fl_engine_register_external_texture(FlEngine *self, int64_t texture_id)
G_MODULE_EXPORT FlEngine * fl_engine_new(FlDartProject *project)
FlEngine * fl_engine_for_id(int64_t id)
void fl_engine_send_touch_move_event(FlEngine *self, FlutterViewId view_id, size_t timestamp, double x, double y, int32_t device)
G_MODULE_EXPORT FlEngine * fl_engine_new_headless(FlDartProject *project)
static void fl_engine_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
G_MODULE_EXPORT FlTextureRegistrar * fl_engine_get_texture_registrar(FlEngine *self)
void fl_engine_send_touch_add_event(FlEngine *self, FlutterViewId view_id, size_t timestamp, double x, double y, int32_t device)
void fl_engine_remove_view(FlEngine *self, FlutterViewId view_id, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
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)
static void setup_keyboard(FlEngine *self)
static void free_locale(FlutterLocale *locale)
void fl_engine_request_app_exit(FlEngine *self)
static void setup_locales(FlEngine *self)
FlRenderable * fl_engine_get_renderable(FlEngine *self, FlutterViewId view_id)
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)
FlutterViewId fl_engine_add_view(FlEngine *self, FlRenderable *renderable, size_t width, size_t height, double pixel_ratio, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
static void fl_engine_update_semantics_cb(const FlutterSemanticsUpdate2 *update, void *user_data)
static bool fl_engine_gl_make_resource_current(void *user_data)
FlutterEngineProcTable * fl_engine_get_embedder_api(FlEngine *self)
void fl_engine_update_accessibility_features(FlEngine *self, int32_t flags)
static void fl_engine_platform_message_cb(const FlutterPlatformMessage *message, void *user_data)
FlKeyboardManager * fl_engine_get_keyboard_manager(FlEngine *self)
void fl_engine_send_touch_remove_event(FlEngine *self, FlutterViewId view_id, size_t timestamp, double x, double y, int32_t device)
void fl_engine_execute_task(FlEngine *self, FlutterTask *task)
void fl_engine_send_touch_down_event(FlEngine *self, FlutterViewId view_id, size_t timestamp, double x, double y, int32_t device)
G_MODULE_EXPORT FlBinaryMessenger * fl_engine_get_binary_messenger(FlEngine *self)
gboolean fl_engine_start(FlEngine *self, GError **error)
static void send_key_event_cb(bool handled, void *user_data)
FlTextInputHandler * fl_engine_get_text_input_handler(FlEngine *self)
static bool collect_software_backing_store(FlEngine *self, const FlutterBackingStore *backing_store)
static constexpr size_t kPlatformTaskRunnerIdentifier
static constexpr int32_t kPointerPanZoomDeviceId
static constexpr int32_t kMousePointerDeviceId
static void fl_engine_class_init(FlEngineClass *klass)
static bool fl_engine_gl_clear_current(void *user_data)
static void fl_engine_plugin_registry_iface_init(FlPluginRegistryInterface *iface)
static bool create_software_backing_store(FlEngine *self, const FlutterBackingStoreConfig *config, FlutterBackingStore *backing_store_out)
GBytes * fl_engine_send_platform_message_finish(FlEngine *self, GAsyncResult *result, GError **error)
GQuark fl_engine_error_quark(void) G_GNUC_CONST
gboolean(* FlEnginePlatformMessageHandler)(FlEngine *engine, const gchar *channel, GBytes *message, const FlutterPlatformMessageResponseHandle *response_handle, gpointer user_data)
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args
FlFramebuffer * fl_framebuffer_new(GLint format, size_t width, size_t height, gboolean shareable)
GLuint fl_framebuffer_get_id(FlFramebuffer *self)
FlKeyboardHandler * fl_keyboard_handler_new(FlBinaryMessenger *messenger, FlKeyboardManager *keyboard_manager)
FlKeyboardManager * fl_keyboard_manager_new(FlEngine *engine)
g_hash_table_insert(self->handlers, g_strdup(channel), handler_new(handler, user_data, destroy_notify))
const gchar FlBinaryMessengerMessageHandler gpointer GDestroyNotify destroy_notify
const gchar FlBinaryMessengerMessageHandler handler
G_BEGIN_DECLS GBytes * message
FlMouseCursorHandler * fl_mouse_cursor_handler_new(FlBinaryMessenger *messenger)
gboolean fl_opengl_manager_make_resource_current(FlOpenGLManager *self)
FlOpenGLManager * fl_opengl_manager_new()
gboolean fl_opengl_manager_clear_current(FlOpenGLManager *self)
gboolean fl_opengl_manager_make_current(FlOpenGLManager *self)
gboolean fl_pixel_buffer_texture_populate(FlPixelBufferTexture *texture, uint32_t width, uint32_t height, FlutterOpenGLTexture *opengl_texture, GError **error)
const uint8_t uint32_t uint32_t GError ** error
FlPluginRegistrar * fl_plugin_registrar_new(FlView *view, FlBinaryMessenger *messenger, FlTextureRegistrar *texture_registrar)
void fl_renderable_present_layers(FlRenderable *self, const FlutterLayer **layers, size_t layers_count)
FlSettings * fl_settings_new()
void fl_settings_handler_start(FlSettingsHandler *self, FlSettings *settings)
FlSettingsHandler * fl_settings_handler_new(FlEngine *engine)
guint const GValue GParamSpec * pspec
FlTaskRunner * fl_task_runner_new(FlEngine *engine)
void fl_task_runner_post_flutter_task(FlTaskRunner *self, FlutterTask task, uint64_t target_time_nanos)
FlTextInputHandler * fl_text_input_handler_new(FlBinaryMessenger *messenger)
void fl_text_input_handler_set_widget(FlTextInputHandler *self, GtkWidget *widget)
GtkWidget * fl_text_input_handler_get_widget(FlTextInputHandler *self)
gboolean fl_texture_gl_populate(FlTextureGL *self, uint32_t width, uint32_t height, FlutterOpenGLTexture *opengl_texture, GError **error)
void fl_texture_registrar_shutdown(FlTextureRegistrar *self)
FlTexture * fl_texture_registrar_lookup_texture(FlTextureRegistrar *self, int64_t texture_id)
FlTextureRegistrar * fl_texture_registrar_new(FlEngine *engine)
G_BEGIN_DECLS FlutterViewId view_id
FlWindowingHandler * fl_windowing_handler_new(FlEngine *engine)
FlutterDesktopBinaryReply callback
bool epoxy_has_gl_extension(const char *extension)
GdkDisplay * gdk_display_get_default()
constexpr int64_t kFlutterImplicitViewId
std::vector< std::string > GetSwitchesFromEnvironment()
FlTaskRunner * task_runner
FlEnginePlatformMessageHandler platform_message_handler
FlMouseCursorHandler * mouse_cursor_handler
GDestroyNotify platform_message_handler_destroy_notify
FlutterViewId next_view_id
FlSettingsHandler * settings_handler
gpointer platform_message_handler_data
FlOpenGLManager * opengl_manager
FlPlatformHandler * platform_handler
FLUTTER_API_SYMBOL(FlutterEngine) engine
FlutterRendererType renderer_type
FlBinaryMessenger * binary_messenger
FlDisplayMonitor * display_monitor
GHashTable * renderables_by_view_id
FlKeyboardManager * keyboard_manager
FlWindowingHandler * windowing_handler
FlTextureRegistrar * texture_registrar
FlutterEngineAOTData aot_data
FlutterEngineProcTable embedder_api
FlTextInputHandler * text_input_handler
FlKeyboardHandler * keyboard_handler
FlutterAddViewCallback add_view_callback
FlutterViewId view_id
The identifier for the view to add. This must be unique.
const FlutterWindowMetricsEvent * view_metrics
void * user_data
The |FlutterAddViewInfo.user_data|.
bool added
True if the add view operation succeeded.
FlutterSize size
The size of the render target the engine expects to render into.
FlutterBackingStoreType type
Specifies the type of backing store.
FlutterOpenGLBackingStore open_gl
The description of the OpenGL backing store.
FlutterSoftwareBackingStore software
The description of the software backing store.
FlutterBackingStoreCreateCallback create_backing_store_callback
size_t struct_size
This size of this struct. Must be sizeof(FlutterCompositor).
FlutterPresentViewCallback present_view_callback
FlutterBackingStoreCollectCallback collect_backing_store_callback
const FlutterTaskRunnerDescription * ui_task_runner
const FlutterTaskRunnerDescription * platform_task_runner
size_t struct_size
The size of this struct. Must be sizeof(FlutterCustomTaskRunners).
FlutterEngineAOTDataSourceType type
const char * elf_path
Absolute path to an ELF library file.
Function-pointer-based versions of the APIs above.
const char * language_code
size_t struct_size
This size of this struct. Must be sizeof(FlutterLocale).
const char * country_code
const char * variant_code
FlutterOpenGLTargetType type
FlutterOpenGLFramebuffer framebuffer
uint32_t name
The name of the framebuffer.
VoidCallback destruction_callback
void * user_data
User data to be returned on the invocation of the destruction callback.
ProcResolver gl_proc_resolver
BoolCallback make_current
UIntCallback fbo_callback
size_t struct_size
The size of this struct. Must be sizeof(FlutterOpenGLRendererConfig).
TextureFrameCallback gl_external_texture_frame_callback
BoolCallback make_resource_current
BoolCallback clear_current
double scroll_delta_y
The y offset of the scroll in physical pixels.
int64_t buttons
The buttons currently pressed, if any.
size_t struct_size
The size of this struct. Must be sizeof(FlutterPointerEvent).
double scale
The scale of the pan/zoom, where 1.0 is the initial scale.
FlutterViewId view_id
The identifier of the view that received the pointer event.
FlutterPointerSignalKind signal_kind
double rotation
The rotation of the pan/zoom in radians, where 0.0 is the initial angle.
double scroll_delta_x
The x offset of the scroll in physical pixels.
double y
The y coordinate of the pointer event in physical pixels.
double x
The x coordinate of the pointer event in physical pixels.
FlutterPointerDeviceKind device_kind
double pan_x
The x offset of the pan/zoom in physical pixels.
FlutterPointerPhase phase
double pan_y
The y offset of the pan/zoom in physical pixels.
size_t layers_count
The count of layers.
void * user_data
The |FlutterCompositor.user_data|.
FlutterViewId view_id
The identifier of the target view.
const FlutterLayer ** layers
The layers that should be composited onto the view.
size_t struct_size
The size of this struct. Must be sizeof(FlutterProjectArgs).
FlutterRemoveViewCallback remove_view_callback
void * user_data
The |FlutterRemoveViewInfo.user_data|.
bool removed
True if the remove view operation succeeded.
FlutterSoftwareRendererConfig software
FlutterOpenGLRendererConfig open_gl
A batch of updates to semantics nodes and custom actions.
FlutterViewId view_id
The ID of the view that includes the node.
FlutterSemanticsAction action
The semantics action.
size_t data_length
The data length.
uint64_t node_id
The semantics node identifier.
const uint8_t * data
Data associated with the action.
VoidCallback destruction_callback
size_t row_bytes
The number of bytes in a single row of the allocation.
size_t height
The number of rows in the allocation.
size_t struct_size
The size of this struct. Must be sizeof(FlutterSoftwareRendererConfig).
SoftwareSurfacePresentCallback surface_present_callback
size_t struct_size
The size of this struct. Must be sizeof(FlutterTaskRunnerDescription).
BoolCallback runs_task_on_current_thread_callback
FlutterTaskRunnerPostTaskCallback post_task_callback
FlutterEngineDisplayId display_id
The identifier of the display the view is rendering on.
size_t struct_size
The size of this struct. Must be sizeof(FlutterWindowMetricsEvent).
size_t height
Physical height of the window.
int64_t view_id
The view that this event is describing.
double pixel_ratio
Scale factor for the physical screen.
size_t width
Physical width of the window.
std::shared_ptr< const fml::Mapping > data