115 FlPluginRegistryInterface* iface);
125 G_IMPLEMENT_INTERFACE(fl_plugin_registry_get_type(),
136 gchar* l = g_strdup(locale);
139 gchar* match = strrchr(l,
'@');
140 if (match !=
nullptr) {
141 if (modifier !=
nullptr) {
142 *modifier = g_strdup(match + 1);
145 }
else if (modifier !=
nullptr) {
149 match = strrchr(l,
'.');
150 if (match !=
nullptr) {
151 if (codeset !=
nullptr) {
152 *codeset = g_strdup(match + 1);
155 }
else if (codeset !=
nullptr) {
159 match = strrchr(l,
'_');
160 if (match !=
nullptr) {
161 if (territory !=
nullptr) {
162 *territory = g_strdup(match + 1);
165 }
else if (territory !=
nullptr) {
166 *territory =
nullptr;
169 if (language !=
nullptr) {
178 g_autoptr(GMutexLocker) locker = g_mutex_locker_new(&
self->renderables_mutex);
179 GWeakRef* ref = g_new(GWeakRef, 1);
188 g_autoptr(GMutexLocker) locker = g_mutex_locker_new(&
self->renderables_mutex);
189 GWeakRef* ref =
static_cast<GWeakRef*
>(g_hash_table_lookup(
190 self->renderables_by_view_id, GINT_TO_POINTER(
view_id)));
191 if (ref ==
nullptr) {
194 return FL_RENDERABLE(g_weak_ref_get(ref));
199 g_autoptr(GMutexLocker) locker = g_mutex_locker_new(&
self->renderables_mutex);
200 g_hash_table_remove(
self->renderables_by_view_id, GINT_TO_POINTER(
view_id));
207 g_task_return_boolean(task,
TRUE);
218 g_task_return_boolean(task,
TRUE);
233 const gchar*
const* languages = g_get_language_names();
234 g_autoptr(GPtrArray) locales_array = g_ptr_array_new_with_free_func(
236 for (
int i = 0; languages[
i] !=
nullptr;
i++) {
237 g_autofree gchar* locale_string = g_strstrip(g_strdup(languages[
i]));
240 if (strcmp(locale_string,
"") == 0) {
244 g_autofree gchar* language =
nullptr;
245 g_autofree gchar* territory =
nullptr;
246 parse_locale(locale_string, &language, &territory,
nullptr,
nullptr);
250 gboolean has_locale = FALSE;
251 for (guint j = 0; !has_locale && j < locales_array->len; j++) {
253 reinterpret_cast<FlutterLocale*
>(g_ptr_array_index(locales_array, j));
254 has_locale = g_strcmp0(locale->
language_code, language) == 0 &&
263 g_ptr_array_add(locales_array, locale);
266 reinterpret_cast<const gchar*
>(g_steal_pointer(&language));
268 reinterpret_cast<const gchar*
>(g_steal_pointer(&territory));
278 g_warning(
"Failed to set up Flutter locales");
290 GLint sized_format = GL_RGBA8;
291 GLint general_format = GL_RGBA;
293 sized_format = GL_BGRA8_EXT;
294 general_format = GL_BGRA_EXT;
300 g_warning(
"Failed to create backing store");
336 uint8_t* allocation =
static_cast<uint8_t*
>(malloc(allocation_length));
337 if (allocation ==
nullptr) {
368 switch (
self->renderer_type) {
383 switch (
self->renderer_type) {
410 return reinterpret_cast<void*
>(eglGetProcAddress(
name));
441 if (!
self->texture_registrar) {
448 g_warning(
"Unable to find texture %" G_GINT64_FORMAT,
texture_id);
454 if (FL_IS_TEXTURE_GL(
texture)) {
456 opengl_texture, &
error);
457 }
else if (FL_IS_PIXEL_BUFFER_TEXTURE(
texture)) {
462 g_warning(
"Unsupported texture type %" G_GINT64_FORMAT,
texture_id);
467 g_warning(
"%s",
error->message);
477 return self->thread == g_thread_self();
482 uint64_t target_time_nanos,
494 gboolean handled = FALSE;
495 if (
self->platform_message_handler !=
nullptr) {
498 handled =
self->platform_message_handler(
500 self->platform_message_handler_data);
518 g_clear_object(&
self->keyboard_manager);
521 g_clear_object(&
self->keyboard_handler);
522 self->keyboard_handler =
526 self->text_input_handler !=
nullptr
529 g_clear_object(&
self->text_input_handler);
531 if (widget !=
nullptr) {
555 g_task_return_pointer(task, g_bytes_new(data, data_length),
556 reinterpret_cast<GDestroyNotify
>(g_bytes_unref));
561 FlPluginRegistry* registry,
563 FlEngine*
self = FL_ENGINE(registry);
566 self->texture_registrar);
570 FlPluginRegistryInterface* iface) {
578 FlEngine*
self = FL_ENGINE(
object);
580 case PROP_BINARY_MESSENGER:
581 g_set_object(&
self->binary_messenger,
582 FL_BINARY_MESSENGER(g_value_get_object(
value)));
585 G_OBJECT_WARN_INVALID_PROPERTY_ID(
object,
prop_id,
pspec);
591 FlEngine*
self = FL_ENGINE(
object);
593 if (
self->engine !=
nullptr) {
595 g_warning(
"Failed to shutdown Flutter engine");
597 self->engine =
nullptr;
600 if (
self->aot_data !=
nullptr) {
602 g_warning(
"Failed to send collect AOT data");
604 self->aot_data =
nullptr;
610 g_clear_object(&
self->project);
611 g_clear_object(&
self->display_monitor);
612 g_clear_object(&
self->opengl_manager);
613 g_clear_object(&
self->texture_registrar);
614 g_clear_object(&
self->binary_messenger);
615 g_clear_object(&
self->settings_handler);
616 g_clear_object(&
self->platform_handler);
617 g_clear_object(&
self->accessibility_handler);
618 g_clear_object(&
self->keyboard_manager);
619 g_clear_object(&
self->text_input_handler);
620 g_clear_object(&
self->keyboard_handler);
621 g_clear_object(&
self->mouse_cursor_handler);
622 g_clear_object(&
self->task_runner);
625 g_mutex_locker_new(&
self->renderables_mutex);
626 g_clear_pointer(&
self->renderables_by_view_id, g_hash_table_unref);
628 g_mutex_clear(&
self->renderables_mutex);
630 if (
self->platform_message_handler_destroy_notify) {
631 self->platform_message_handler_destroy_notify(
632 self->platform_message_handler_data);
634 self->platform_message_handler_data =
nullptr;
635 self->platform_message_handler_destroy_notify =
nullptr;
637 G_OBJECT_CLASS(fl_engine_parent_class)->dispose(
object);
644 g_object_class_install_property(
645 G_OBJECT_CLASS(klass), PROP_BINARY_MESSENGER,
647 "binary-messenger",
"messenger",
"Binary messenger",
648 fl_binary_messenger_get_type(),
649 static_cast<GParamFlags
>(G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY |
650 G_PARAM_STATIC_STRINGS)));
653 "on-pre-engine-restart", fl_engine_get_type(), G_SIGNAL_RUN_LAST, 0,
654 nullptr,
nullptr,
nullptr, G_TYPE_NONE, 0);
656 "update-semantics", fl_engine_get_type(), G_SIGNAL_RUN_LAST, 0,
nullptr,
657 nullptr,
nullptr, G_TYPE_NONE, 1, G_TYPE_POINTER);
661 self->thread = g_thread_self();
665 g_warning(
"Failed get get engine function pointers");
670 self->display_monitor =
675 self->next_view_id = 1;
676 g_mutex_init(&
self->renderables_mutex);
677 self->renderables_by_view_id = g_hash_table_new_full(
678 g_direct_hash, g_direct_equal,
nullptr, [](gpointer
value) {
679 GWeakRef* ref =
static_cast<GWeakRef*
>(
value);
680 g_weak_ref_clear(ref);
688 FlBinaryMessenger* binary_messenger) {
689 g_return_val_if_fail(FL_IS_DART_PROJECT(project),
nullptr);
691 FlEngine*
self = FL_ENGINE(g_object_new(fl_engine_get_type(),
nullptr));
693 self->project = FL_DART_PROJECT(g_object_ref(project));
694 const gchar* renderer = g_getenv(
"FLUTTER_LINUX_RENDERER");
695 if (g_strcmp0(renderer,
"software") == 0) {
698 "Using the software renderer. Not all features are supported. This is "
701 "To switch back to the default renderer, unset the "
702 "FLUTTER_LINUX_RENDERER environment variable.");
704 if (renderer !=
nullptr && strcmp(renderer,
"opengl") != 0) {
705 g_warning(
"Unknown renderer type '%s', defaulting to opengl", renderer);
710 if (binary_messenger !=
nullptr) {
711 self->binary_messenger =
712 FL_BINARY_MESSENGER(g_object_ref(binary_messenger));
717 self->mouse_cursor_handler =
725 void*
engine =
reinterpret_cast<void*
>(
id);
726 g_return_val_if_fail(FL_IS_ENGINE(
engine),
nullptr);
735 FlBinaryMessenger* binary_messenger) {
746 return self->renderer_type;
750 g_return_val_if_fail(FL_IS_ENGINE(
self),
nullptr);
751 return self->opengl_manager;
755 g_return_val_if_fail(FL_IS_ENGINE(
self),
nullptr);
756 return self->display_monitor;
760 g_return_val_if_fail(FL_IS_ENGINE(
self), FALSE);
764 switch (config.
type) {
770 [](
void*
user_data,
const void* allocation,
size_t row_bytes,
771 size_t height) {
return true; };
790 "Unsupported renderer type");
816 gboolean has_enable_impeller = FALSE;
818 if (env_switch ==
"--enable-impeller" ||
819 env_switch ==
"--enable-impeller=true") {
820 enable_impeller =
TRUE;
821 has_enable_impeller =
TRUE;
822 }
else if (env_switch ==
"--enable-impeller=false") {
823 enable_impeller = FALSE;
824 has_enable_impeller =
TRUE;
829 g_ptr_array_new_with_free_func(g_free);
830 g_ptr_array_insert(command_line_args, 0, g_strdup(
"flutter"));
832 g_ptr_array_add(command_line_args, g_strdup(env_switch.c_str()));
835 g_ptr_array_add(command_line_args, g_strdup(
"--impeller-use-sdfs"));
837 if (enable_impeller && !has_enable_impeller) {
838 g_ptr_array_add(command_line_args, g_strdup(
"--enable-impeller"));
841 gchar** dart_entrypoint_args =
848 args.command_line_argc = command_line_args->len;
849 args.command_line_argv =
850 reinterpret_cast<const char* const*
>(command_line_args->pdata);
853 args.custom_task_runners = &custom_task_runners;
854 args.shutdown_dart_vm_when_done =
true;
856 args.dart_entrypoint_argc =
857 dart_entrypoint_args !=
nullptr ? g_strv_length(dart_entrypoint_args) : 0;
858 args.dart_entrypoint_argv =
859 reinterpret_cast<const char* const*
>(dart_entrypoint_args);
860 args.engine_id =
reinterpret_cast<int64_t
>(
self);
870 args.compositor = &compositor;
872 if (
self->embedder_api.RunsAOTCompiledDartCode()) {
876 if (
self->embedder_api.CreateAOTData(&source, &
self->aot_data) !=
879 "Failed to create AOT data");
889 "Failed to initialize Flutter engine");
893 result =
self->embedder_api.RunInitialized(
self->engine);
896 "Failed to run Flutter engine");
910 result =
self->embedder_api.UpdateSemanticsEnabled(
self->engine,
TRUE);
912 g_warning(
"Failed to enable accessibility features on Flutter engine");
921 return &(
self->embedder_api);
926 size_t displays_length) {
927 g_return_if_fail(FL_IS_ENGINE(
self));
933 g_warning(
"Failed to notify display update to Flutter engine: %d", result);
948 GCancellable* cancellable,
951 g_return_val_if_fail(FL_IS_ENGINE(
self), -1);
956 self->next_view_id++;
966 metrics.
width = min_width;
967 metrics.
height = min_height;
988 g_object_unref(task);
995 GAsyncResult* result,
997 g_return_val_if_fail(FL_IS_ENGINE(
self), FALSE);
998 return g_task_propagate_boolean(G_TASK(result),
error);
1002 g_return_val_if_fail(FL_IS_ENGINE(
self),
nullptr);
1009 GCancellable* cancellable,
1012 g_return_if_fail(FL_IS_ENGINE(
self));
1024 self->embedder_api.RemoveView(
self->engine, &info);
1030 g_object_unref(task);
1035 GAsyncResult* result,
1037 g_return_val_if_fail(FL_IS_ENGINE(
self), FALSE);
1038 return g_task_propagate_boolean(G_TASK(result),
error);
1046 g_return_if_fail(FL_IS_ENGINE(
self));
1047 g_return_if_fail(
handler !=
nullptr);
1049 if (
self->platform_message_handler_destroy_notify) {
1050 self->platform_message_handler_destroy_notify(
1051 self->platform_message_handler_data);
1065 g_return_val_if_fail(FL_IS_ENGINE(
self), FALSE);
1066 g_return_val_if_fail(handle !=
nullptr, FALSE);
1068 if (
self->engine ==
nullptr) {
1070 "No engine to send response to");
1074 gsize data_length = 0;
1075 const uint8_t* data =
nullptr;
1076 if (response !=
nullptr) {
1078 static_cast<const uint8_t*
>(g_bytes_get_data(response, &data_length));
1081 self->engine, handle, data, data_length);
1085 "Failed to send platform message response");
1095 GCancellable* cancellable,
1098 g_return_if_fail(FL_IS_ENGINE(
self));
1100 GTask* task =
nullptr;
1105 if (
self->engine ==
nullptr) {
1108 g_object_unref(task);
1113 self->embedder_api.PlatformMessageCreateResponseHandle(
1119 "Failed to create response handle");
1120 g_object_unref(task);
1123 }
else if (
self->engine ==
nullptr) {
1132 ?
static_cast<const uint8_t*
>(g_bytes_get_data(
message,
nullptr))
1137 self->embedder_api.SendPlatformMessage(
self->engine, &fl_message);
1139 if (result !=
kSuccess && task !=
nullptr) {
1142 "Failed to send platform messages");
1143 g_object_unref(task);
1146 if (response_handle !=
nullptr) {
1147 if (
self->embedder_api.PlatformMessageReleaseResponseHandle(
1149 g_warning(
"Failed to release response handle");
1155 GAsyncResult* result,
1157 g_return_val_if_fail(FL_IS_ENGINE(
self), FALSE);
1158 g_return_val_if_fail(g_task_is_valid(result,
self), FALSE);
1160 return static_cast<GBytes*
>(g_task_propagate_pointer(G_TASK(result),
error));
1170 double pixel_ratio) {
1171 g_return_if_fail(FL_IS_ENGINE(
self));
1173 if (
self->engine ==
nullptr) {
1179 event.width = min_width;
1180 event.height = min_height;
1181 event.pixel_ratio = pixel_ratio;
1182 event.display_id = display_id;
1184 event.has_constraints =
true;
1185 event.min_width_constraint = min_width;
1186 event.min_height_constraint = min_height;
1187 event.max_width_constraint = max_width;
1188 event.max_height_constraint = max_height;
1189 if (
self->embedder_api.SendWindowMetricsEvent(
self->engine, &event) !=
1191 g_warning(
"Failed to send window metrics");
1202 double scroll_delta_x,
1203 double scroll_delta_y,
1205 g_return_if_fail(FL_IS_ENGINE(
self));
1207 if (
self->engine ==
nullptr) {
1213 fl_event.
phase = phase;
1217 if (scroll_delta_x != 0 || scroll_delta_y != 0) {
1226 if (
self->embedder_api.SendPointerEvent(
self->engine, &fl_event, 1) !=
1228 g_warning(
"Failed to send pointer event");
1238 g_return_if_fail(FL_IS_ENGINE(
self));
1240 if (
self->engine ==
nullptr) {
1253 event.struct_size =
sizeof(event);
1255 if (
self->embedder_api.SendPointerEvent(
self->engine, &event, 1) !=
1257 g_warning(
"Failed to send pointer event");
1267 g_return_if_fail(FL_IS_ENGINE(
self));
1269 if (
self->engine ==
nullptr) {
1282 event.struct_size =
sizeof(event);
1284 if (
self->embedder_api.SendPointerEvent(
self->engine, &event, 1) !=
1286 g_warning(
"Failed to send pointer event");
1296 g_return_if_fail(FL_IS_ENGINE(
self));
1298 if (
self->engine ==
nullptr) {
1311 event.struct_size =
sizeof(event);
1313 if (
self->embedder_api.SendPointerEvent(
self->engine, &event, 1) !=
1315 g_warning(
"Failed to send pointer event");
1325 g_return_if_fail(FL_IS_ENGINE(
self));
1327 if (
self->engine ==
nullptr) {
1340 event.struct_size =
sizeof(event);
1342 if (
self->embedder_api.SendPointerEvent(
self->engine, &event, 1) !=
1344 g_warning(
"Failed to send pointer event");
1354 g_return_if_fail(FL_IS_ENGINE(
self));
1356 if (
self->engine ==
nullptr) {
1369 event.struct_size =
sizeof(event);
1371 if (
self->embedder_api.SendPointerEvent(
self->engine, &event, 1) !=
1373 g_warning(
"Failed to send pointer event");
1387 g_return_if_fail(FL_IS_ENGINE(
self));
1389 if (
self->engine ==
nullptr) {
1398 fl_event.
phase = phase;
1399 fl_event.
pan_x = pan_x;
1400 fl_event.
pan_y = pan_y;
1401 fl_event.
scale = scale;
1406 if (
self->embedder_api.SendPointerEvent(
self->engine, &fl_event, 1) !=
1408 g_warning(
"Failed to send pointer event");
1414 gboolean* return_value = g_new0(gboolean, 1);
1415 *return_value = handled;
1416 g_task_return_pointer(task, return_value, g_free);
1421 GCancellable* cancellable,
1424 g_return_if_fail(FL_IS_ENGINE(
self));
1428 if (
self->engine ==
nullptr) {
1438 g_object_unref(task);
1443 GAsyncResult* result,
1446 g_return_val_if_fail(FL_IS_ENGINE(
self), FALSE);
1447 g_return_val_if_fail(g_task_is_valid(result,
self), FALSE);
1449 g_autofree gboolean* return_value =
1450 static_cast<gboolean*
>(g_task_propagate_pointer(G_TASK(result),
error));
1451 if (return_value ==
nullptr) {
1455 *handled = *return_value;
1464 g_return_if_fail(FL_IS_ENGINE(
self));
1466 if (
self->engine ==
nullptr) {
1470 const uint8_t* action_data =
nullptr;
1471 size_t action_data_length = 0;
1472 if (data !=
nullptr) {
1473 action_data =
static_cast<const uint8_t*
>(
1474 g_bytes_get_data(data, &action_data_length));
1482 info.
data = action_data;
1484 if (
self->embedder_api.SendSemanticsAction(
self->engine, &info) !=
kSuccess) {
1485 g_warning(
"Failed to send semantics action");
1491 g_return_val_if_fail(FL_IS_ENGINE(
self), FALSE);
1492 return self->embedder_api.MarkExternalTextureFrameAvailable(
1498 g_return_val_if_fail(FL_IS_ENGINE(
self), FALSE);
1505 g_return_val_if_fail(FL_IS_ENGINE(
self), FALSE);
1506 return self->embedder_api.UnregisterExternalTexture(
self->engine,
1512 g_return_val_if_fail(FL_IS_ENGINE(
self),
nullptr);
1513 return self->binary_messenger;
1517 g_return_val_if_fail(FL_IS_ENGINE(
self),
nullptr);
1518 return self->task_runner;
1522 g_return_if_fail(FL_IS_ENGINE(
self));
1524 g_warning(
"Failed to run task");
1530 g_return_val_if_fail(FL_IS_ENGINE(
self),
nullptr);
1531 return self->texture_registrar;
1535 g_return_if_fail(FL_IS_ENGINE(
self));
1537 if (
self->engine ==
nullptr) {
1541 if (
self->embedder_api.UpdateAccessibilityFeatures(
1544 g_warning(
"Failed to update accessibility features");
1549 g_return_if_fail(FL_IS_ENGINE(
self));
1554 g_return_val_if_fail(FL_IS_ENGINE(
self),
nullptr);
1555 return self->keyboard_manager;
1559 g_return_val_if_fail(FL_IS_ENGINE(
self),
nullptr);
1560 return self->text_input_handler;
1564 g_return_val_if_fail(FL_IS_ENGINE(
self),
nullptr);
1565 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
FlAccessibilityHandler * fl_accessibility_handler_new(FlEngine *engine)
g_autoptr(FlEngine) engine
FlRenderable * renderable
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_MODULE_EXPORT const gchar * fl_dart_project_get_assets_path(FlDartProject *self)
G_MODULE_EXPORT gboolean fl_dart_project_get_enable_impeller(FlDartProject *project)
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)
static void set_renderable(FlEngine *self, int64_t view_id, FlRenderable *renderable)
Stores a weak reference to the renderable with the given ID.
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_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)
static bool collect_opengl_backing_store(FlEngine *self, const FlutterBackingStore *backing_store)
static bool compositor_present_view_callback(const FlutterPresentViewInfo *info)
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 remove_renderable(FlEngine *self, int64_t view_id)
Remove a renderable that no longer exists.
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)
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)
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)
static FlRenderable * get_renderable(FlEngine *self, int64_t view_id)
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)
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
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
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
FlAccessibilityHandler * accessibility_handler
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
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.
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.
size_t min_height_constraint
size_t min_width_constraint
int64_t view_id
The view that this event is describing.
double pixel_ratio
Scale factor for the physical screen.
size_t max_width_constraint
size_t max_height_constraint
size_t width
Physical width of the window.