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 g_ptr_array_new_with_free_func(g_free);
817 g_ptr_array_insert(command_line_args, 0, g_strdup(
"flutter"));
819 g_ptr_array_add(command_line_args, g_strdup(env_switch.c_str()));
822 g_ptr_array_add(command_line_args, g_strdup(
"--impeller-use-sdfs"));
824 gchar** dart_entrypoint_args =
831 args.command_line_argc = command_line_args->len;
832 args.command_line_argv =
833 reinterpret_cast<const char* const*
>(command_line_args->pdata);
836 args.custom_task_runners = &custom_task_runners;
837 args.shutdown_dart_vm_when_done =
true;
839 args.dart_entrypoint_argc =
840 dart_entrypoint_args !=
nullptr ? g_strv_length(dart_entrypoint_args) : 0;
841 args.dart_entrypoint_argv =
842 reinterpret_cast<const char* const*
>(dart_entrypoint_args);
843 args.engine_id =
reinterpret_cast<int64_t
>(
self);
853 args.compositor = &compositor;
855 if (
self->embedder_api.RunsAOTCompiledDartCode()) {
859 if (
self->embedder_api.CreateAOTData(&source, &
self->aot_data) !=
862 "Failed to create AOT data");
872 "Failed to initialize Flutter engine");
876 result =
self->embedder_api.RunInitialized(
self->engine);
879 "Failed to run Flutter engine");
893 result =
self->embedder_api.UpdateSemanticsEnabled(
self->engine,
TRUE);
895 g_warning(
"Failed to enable accessibility features on Flutter engine");
904 return &(
self->embedder_api);
909 size_t displays_length) {
910 g_return_if_fail(FL_IS_ENGINE(
self));
916 g_warning(
"Failed to notify display update to Flutter engine: %d", result);
931 GCancellable* cancellable,
934 g_return_val_if_fail(FL_IS_ENGINE(
self), -1);
939 self->next_view_id++;
949 metrics.
width = min_width;
950 metrics.
height = min_height;
971 g_object_unref(task);
978 GAsyncResult* result,
980 g_return_val_if_fail(FL_IS_ENGINE(
self), FALSE);
981 return g_task_propagate_boolean(G_TASK(result),
error);
985 g_return_val_if_fail(FL_IS_ENGINE(
self),
nullptr);
992 GCancellable* cancellable,
995 g_return_if_fail(FL_IS_ENGINE(
self));
1007 self->embedder_api.RemoveView(
self->engine, &info);
1013 g_object_unref(task);
1018 GAsyncResult* result,
1020 g_return_val_if_fail(FL_IS_ENGINE(
self), FALSE);
1021 return g_task_propagate_boolean(G_TASK(result),
error);
1029 g_return_if_fail(FL_IS_ENGINE(
self));
1030 g_return_if_fail(
handler !=
nullptr);
1032 if (
self->platform_message_handler_destroy_notify) {
1033 self->platform_message_handler_destroy_notify(
1034 self->platform_message_handler_data);
1048 g_return_val_if_fail(FL_IS_ENGINE(
self), FALSE);
1049 g_return_val_if_fail(handle !=
nullptr, FALSE);
1051 if (
self->engine ==
nullptr) {
1053 "No engine to send response to");
1057 gsize data_length = 0;
1058 const uint8_t* data =
nullptr;
1059 if (response !=
nullptr) {
1061 static_cast<const uint8_t*
>(g_bytes_get_data(response, &data_length));
1064 self->engine, handle, data, data_length);
1068 "Failed to send platform message response");
1078 GCancellable* cancellable,
1081 g_return_if_fail(FL_IS_ENGINE(
self));
1083 GTask* task =
nullptr;
1088 if (
self->engine ==
nullptr) {
1091 g_object_unref(task);
1096 self->embedder_api.PlatformMessageCreateResponseHandle(
1102 "Failed to create response handle");
1103 g_object_unref(task);
1106 }
else if (
self->engine ==
nullptr) {
1115 ?
static_cast<const uint8_t*
>(g_bytes_get_data(
message,
nullptr))
1120 self->embedder_api.SendPlatformMessage(
self->engine, &fl_message);
1122 if (result !=
kSuccess && task !=
nullptr) {
1125 "Failed to send platform messages");
1126 g_object_unref(task);
1129 if (response_handle !=
nullptr) {
1130 if (
self->embedder_api.PlatformMessageReleaseResponseHandle(
1132 g_warning(
"Failed to release response handle");
1138 GAsyncResult* result,
1140 g_return_val_if_fail(FL_IS_ENGINE(
self), FALSE);
1141 g_return_val_if_fail(g_task_is_valid(result,
self), FALSE);
1143 return static_cast<GBytes*
>(g_task_propagate_pointer(G_TASK(result),
error));
1153 double pixel_ratio) {
1154 g_return_if_fail(FL_IS_ENGINE(
self));
1156 if (
self->engine ==
nullptr) {
1162 event.width = min_width;
1163 event.height = min_height;
1164 event.pixel_ratio = pixel_ratio;
1165 event.display_id = display_id;
1167 event.has_constraints =
true;
1168 event.min_width_constraint = min_width;
1169 event.min_height_constraint = min_height;
1170 event.max_width_constraint = max_width;
1171 event.max_height_constraint = max_height;
1172 if (
self->embedder_api.SendWindowMetricsEvent(
self->engine, &event) !=
1174 g_warning(
"Failed to send window metrics");
1185 double scroll_delta_x,
1186 double scroll_delta_y,
1188 g_return_if_fail(FL_IS_ENGINE(
self));
1190 if (
self->engine ==
nullptr) {
1196 fl_event.
phase = phase;
1200 if (scroll_delta_x != 0 || scroll_delta_y != 0) {
1209 if (
self->embedder_api.SendPointerEvent(
self->engine, &fl_event, 1) !=
1211 g_warning(
"Failed to send pointer event");
1221 g_return_if_fail(FL_IS_ENGINE(
self));
1223 if (
self->engine ==
nullptr) {
1236 event.struct_size =
sizeof(event);
1238 if (
self->embedder_api.SendPointerEvent(
self->engine, &event, 1) !=
1240 g_warning(
"Failed to send pointer event");
1250 g_return_if_fail(FL_IS_ENGINE(
self));
1252 if (
self->engine ==
nullptr) {
1265 event.struct_size =
sizeof(event);
1267 if (
self->embedder_api.SendPointerEvent(
self->engine, &event, 1) !=
1269 g_warning(
"Failed to send pointer event");
1279 g_return_if_fail(FL_IS_ENGINE(
self));
1281 if (
self->engine ==
nullptr) {
1294 event.struct_size =
sizeof(event);
1296 if (
self->embedder_api.SendPointerEvent(
self->engine, &event, 1) !=
1298 g_warning(
"Failed to send pointer event");
1308 g_return_if_fail(FL_IS_ENGINE(
self));
1310 if (
self->engine ==
nullptr) {
1323 event.struct_size =
sizeof(event);
1325 if (
self->embedder_api.SendPointerEvent(
self->engine, &event, 1) !=
1327 g_warning(
"Failed to send pointer event");
1337 g_return_if_fail(FL_IS_ENGINE(
self));
1339 if (
self->engine ==
nullptr) {
1352 event.struct_size =
sizeof(event);
1354 if (
self->embedder_api.SendPointerEvent(
self->engine, &event, 1) !=
1356 g_warning(
"Failed to send pointer event");
1370 g_return_if_fail(FL_IS_ENGINE(
self));
1372 if (
self->engine ==
nullptr) {
1381 fl_event.
phase = phase;
1382 fl_event.
pan_x = pan_x;
1383 fl_event.
pan_y = pan_y;
1384 fl_event.
scale = scale;
1389 if (
self->embedder_api.SendPointerEvent(
self->engine, &fl_event, 1) !=
1391 g_warning(
"Failed to send pointer event");
1397 gboolean* return_value = g_new0(gboolean, 1);
1398 *return_value = handled;
1399 g_task_return_pointer(task, return_value, g_free);
1404 GCancellable* cancellable,
1407 g_return_if_fail(FL_IS_ENGINE(
self));
1411 if (
self->engine ==
nullptr) {
1421 g_object_unref(task);
1426 GAsyncResult* result,
1429 g_return_val_if_fail(FL_IS_ENGINE(
self), FALSE);
1430 g_return_val_if_fail(g_task_is_valid(result,
self), FALSE);
1432 g_autofree gboolean* return_value =
1433 static_cast<gboolean*
>(g_task_propagate_pointer(G_TASK(result),
error));
1434 if (return_value ==
nullptr) {
1438 *handled = *return_value;
1447 g_return_if_fail(FL_IS_ENGINE(
self));
1449 if (
self->engine ==
nullptr) {
1453 const uint8_t* action_data =
nullptr;
1454 size_t action_data_length = 0;
1455 if (data !=
nullptr) {
1456 action_data =
static_cast<const uint8_t*
>(
1457 g_bytes_get_data(data, &action_data_length));
1465 info.
data = action_data;
1467 if (
self->embedder_api.SendSemanticsAction(
self->engine, &info) !=
kSuccess) {
1468 g_warning(
"Failed to send semantics action");
1474 g_return_val_if_fail(FL_IS_ENGINE(
self), FALSE);
1475 return self->embedder_api.MarkExternalTextureFrameAvailable(
1481 g_return_val_if_fail(FL_IS_ENGINE(
self), FALSE);
1488 g_return_val_if_fail(FL_IS_ENGINE(
self), FALSE);
1489 return self->embedder_api.UnregisterExternalTexture(
self->engine,
1495 g_return_val_if_fail(FL_IS_ENGINE(
self),
nullptr);
1496 return self->binary_messenger;
1500 g_return_val_if_fail(FL_IS_ENGINE(
self),
nullptr);
1501 return self->task_runner;
1505 g_return_if_fail(FL_IS_ENGINE(
self));
1507 g_warning(
"Failed to run task");
1513 g_return_val_if_fail(FL_IS_ENGINE(
self),
nullptr);
1514 return self->texture_registrar;
1518 g_return_if_fail(FL_IS_ENGINE(
self));
1520 if (
self->engine ==
nullptr) {
1524 if (
self->embedder_api.UpdateAccessibilityFeatures(
1527 g_warning(
"Failed to update accessibility features");
1532 g_return_if_fail(FL_IS_ENGINE(
self));
1537 g_return_val_if_fail(FL_IS_ENGINE(
self),
nullptr);
1538 return self->keyboard_manager;
1542 g_return_val_if_fail(FL_IS_ENGINE(
self),
nullptr);
1543 return self->text_input_handler;
1547 g_return_val_if_fail(FL_IS_ENGINE(
self),
nullptr);
1548 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 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.
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.
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.