5#include "flutter/shell/platform/linux/public/flutter_linux/fl_engine.h"
13#include "flutter/common/constants.h"
14#include "flutter/shell/platform/common/app_lifecycle_state.h"
15#include "flutter/shell/platform/common/engine_switches.h"
16#include "flutter/shell/platform/embedder/embedder.h"
17#include "flutter/shell/platform/linux/fl_binary_messenger_private.h"
18#include "flutter/shell/platform/linux/fl_dart_project_private.h"
19#include "flutter/shell/platform/linux/fl_engine_private.h"
20#include "flutter/shell/platform/linux/fl_pixel_buffer_texture_private.h"
21#include "flutter/shell/platform/linux/fl_plugin_registrar_private.h"
22#include "flutter/shell/platform/linux/fl_renderer.h"
23#include "flutter/shell/platform/linux/fl_renderer_headless.h"
24#include "flutter/shell/platform/linux/fl_settings_plugin.h"
25#include "flutter/shell/platform/linux/fl_texture_gl_private.h"
26#include "flutter/shell/platform/linux/fl_texture_registrar_private.h"
27#include "flutter/shell/platform/linux/public/flutter_linux/fl_plugin_registry.h"
28#include "flutter/shell/platform/linux/public/flutter_linux/fl_string_codec.h"
75 FlPluginRegistryInterface* iface);
81 G_IMPLEMENT_INTERFACE(fl_plugin_registry_get_type(),
92 gchar* l = g_strdup(locale);
95 gchar*
match = strrchr(l,
'@');
96 if (
match !=
nullptr) {
97 if (modifier !=
nullptr) {
98 *modifier = g_strdup(
match + 1);
101 }
else if (modifier !=
nullptr) {
105 match = strrchr(l,
'.');
106 if (
match !=
nullptr) {
107 if (codeset !=
nullptr) {
108 *codeset = g_strdup(
match + 1);
111 }
else if (codeset !=
nullptr) {
115 match = strrchr(l,
'_');
116 if (
match !=
nullptr) {
117 if (territory !=
nullptr) {
118 *territory = g_strdup(
match + 1);
121 }
else if (territory !=
nullptr) {
122 *territory =
nullptr;
125 if (language !=
nullptr) {
146 nullptr,
nullptr,
nullptr);
151 const gchar*
const* languages = g_get_language_names();
152 g_autoptr(GPtrArray) locales_array = g_ptr_array_new_with_free_func(g_free);
154 g_autoptr(GPtrArray) locale_strings = g_ptr_array_new_with_free_func(g_free);
155 for (
int i = 0; languages[
i] !=
nullptr;
i++) {
156 gchar *language, *territory;
157 parse_locale(languages[
i], &language, &territory,
nullptr,
nullptr);
158 if (language !=
nullptr) {
159 g_ptr_array_add(locale_strings, language);
161 if (territory !=
nullptr) {
162 g_ptr_array_add(locale_strings, territory);
167 g_ptr_array_add(locales_array, locale);
180 g_warning(
"Failed to set up Flutter locales");
189 g_return_val_if_fail(FL_IS_RENDERER(
user_data),
false);
198 g_return_val_if_fail(FL_IS_RENDERER(
user_data),
false);
206 g_return_val_if_fail(FL_IS_RENDERER(
user_data),
false);
255 if (!
self->texture_registrar) {
262 g_warning(
"Unable to find texture %" G_GINT64_FORMAT,
texture_id);
267 g_autoptr(GError)
error =
nullptr;
268 if (FL_IS_TEXTURE_GL(
texture)) {
270 opengl_texture, &
error);
271 }
else if (FL_IS_PIXEL_BUFFER_TEXTURE(
texture)) {
276 g_warning(
"Unsupported texture type %" G_GINT64_FORMAT,
texture_id);
281 g_warning(
"%s",
error->message);
291 return self->thread == g_thread_self();
296 uint64_t target_time_nanos,
308 gboolean handled =
FALSE;
309 if (
self->platform_message_handler !=
nullptr) {
310 g_autoptr(GBytes)
data =
312 handled =
self->platform_message_handler(
314 self->platform_message_handler_data);
328 if (
self->update_semantics_handler !=
nullptr) {
330 self->update_semantics_handler_data);
342 if (
self->on_pre_engine_restart_handler !=
nullptr) {
343 self->on_pre_engine_restart_handler(
344 self,
self->on_pre_engine_restart_handler_data);
353 g_autoptr(GTask) task = G_TASK(
user_data);
354 g_task_return_pointer(task, g_bytes_new(
data, data_length),
355 reinterpret_cast<GDestroyNotify
>(g_bytes_unref));
360 FlPluginRegistry* registry,
362 FlEngine*
self = FL_ENGINE(registry);
365 self->texture_registrar);
369 FlPluginRegistryInterface* iface) {
377 FlEngine*
self = FL_ENGINE(
object);
379 case kPropBinaryMessenger:
380 g_set_object(&
self->binary_messenger,
381 FL_BINARY_MESSENGER(g_value_get_object(
value)));
384 G_OBJECT_WARN_INVALID_PROPERTY_ID(
object,
prop_id,
pspec);
390 FlEngine*
self = FL_ENGINE(
object);
392 if (
self->engine !=
nullptr) {
393 self->embedder_api.Shutdown(
self->engine);
394 self->engine =
nullptr;
397 if (
self->aot_data !=
nullptr) {
398 self->embedder_api.CollectAOTData(
self->aot_data);
399 self->aot_data =
nullptr;
402 g_clear_object(&
self->project);
403 g_clear_object(&
self->renderer);
404 g_clear_object(&
self->texture_registrar);
405 g_clear_object(&
self->binary_messenger);
406 g_clear_object(&
self->settings_plugin);
407 g_clear_object(&
self->task_runner);
409 if (
self->platform_message_handler_destroy_notify) {
410 self->platform_message_handler_destroy_notify(
411 self->platform_message_handler_data);
413 self->platform_message_handler_data =
nullptr;
414 self->platform_message_handler_destroy_notify =
nullptr;
416 if (
self->update_semantics_handler_destroy_notify) {
417 self->update_semantics_handler_destroy_notify(
418 self->update_semantics_handler_data);
420 self->update_semantics_handler_data =
nullptr;
421 self->update_semantics_handler_destroy_notify =
nullptr;
423 if (
self->on_pre_engine_restart_handler_destroy_notify) {
424 self->on_pre_engine_restart_handler_destroy_notify(
425 self->on_pre_engine_restart_handler_data);
427 self->on_pre_engine_restart_handler_data =
nullptr;
428 self->on_pre_engine_restart_handler_destroy_notify =
nullptr;
430 G_OBJECT_CLASS(fl_engine_parent_class)->dispose(
object);
437 g_object_class_install_property(
438 G_OBJECT_CLASS(klass), kPropBinaryMessenger,
440 "binary-messenger",
"messenger",
"Binary messenger",
441 fl_binary_messenger_get_type(),
442 static_cast<GParamFlags
>(G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY |
443 G_PARAM_STATIC_STRINGS)));
447 self->thread = g_thread_self();
456 g_return_val_if_fail(FL_IS_DART_PROJECT(project),
nullptr);
457 g_return_val_if_fail(FL_IS_RENDERER(
renderer),
nullptr);
459 FlEngine*
self = FL_ENGINE(g_object_new(fl_engine_get_type(),
nullptr));
460 self->project = FL_DART_PROJECT(g_object_ref(project));
472 g_return_val_if_fail(FL_IS_ENGINE(
self),
FALSE);
505 g_ptr_array_insert(command_line_args, 0, g_strdup(
"flutter"));
507 gchar** dart_entrypoint_args =
514 args.command_line_argc = command_line_args->len;
515 args.command_line_argv =
516 reinterpret_cast<const char* const*
>(command_line_args->pdata);
519 args.custom_task_runners = &custom_task_runners;
520 args.shutdown_dart_vm_when_done =
true;
522 args.dart_entrypoint_argc =
523 dart_entrypoint_args !=
nullptr ? g_strv_length(dart_entrypoint_args) : 0;
524 args.dart_entrypoint_argv =
525 reinterpret_cast<const char* const*
>(dart_entrypoint_args);
535 args.compositor = &compositor;
537 if (
self->embedder_api.RunsAOTCompiledDartCode()) {
544 "Failed to create AOT data");
554 "Failed to initialize Flutter engine");
561 "Failed to run Flutter engine");
573 g_warning(
"Failed to enable accessibility features on Flutter engine");
579 if (refresh_rate <= 0.0) {
588 std::vector displays = {display};
589 result =
self->embedder_api.NotifyDisplayUpdate(
593 g_warning(
"Failed to notify display update to Flutter engine: %d",
result);
600 return &(
self->embedder_api);
607 GDestroyNotify destroy_notify) {
608 g_return_if_fail(FL_IS_ENGINE(
self));
609 g_return_if_fail(handler !=
nullptr);
611 if (
self->platform_message_handler_destroy_notify) {
612 self->platform_message_handler_destroy_notify(
613 self->platform_message_handler_data);
616 self->platform_message_handler = handler;
618 self->platform_message_handler_destroy_notify = destroy_notify;
625 GDestroyNotify destroy_notify) {
626 g_return_if_fail(FL_IS_ENGINE(
self));
628 if (
self->update_semantics_handler_destroy_notify) {
629 self->update_semantics_handler_destroy_notify(
630 self->update_semantics_handler_data);
633 self->update_semantics_handler = handler;
635 self->update_semantics_handler_destroy_notify = destroy_notify;
642 GDestroyNotify destroy_notify) {
643 g_return_if_fail(FL_IS_ENGINE(
self));
645 if (
self->on_pre_engine_restart_handler_destroy_notify) {
646 self->on_pre_engine_restart_handler_destroy_notify(
647 self->on_pre_engine_restart_handler_data);
650 self->on_pre_engine_restart_handler = handler;
652 self->on_pre_engine_restart_handler_destroy_notify = destroy_notify;
661 g_return_val_if_fail(FL_IS_ENGINE(
self),
FALSE);
662 g_return_val_if_fail(handle !=
nullptr,
FALSE);
664 if (
self->engine ==
nullptr) {
666 "No engine to send response to");
670 gsize data_length = 0;
671 const uint8_t*
data =
nullptr;
672 if (response !=
nullptr) {
674 static_cast<const uint8_t*
>(g_bytes_get_data(response, &data_length));
677 self->engine, handle,
data, data_length);
681 "Failed to send platform message response");
689 const gchar* channel,
691 GCancellable* cancellable,
694 g_return_if_fail(FL_IS_ENGINE(
self));
696 GTask* task =
nullptr;
701 if (
self->engine ==
nullptr) {
708 self->embedder_api.PlatformMessageCreateResponseHandle(
714 "Failed to create response handle");
715 g_object_unref(task);
718 }
else if (
self->engine ==
nullptr) {
727 ?
static_cast<const uint8_t*
>(g_bytes_get_data(
message,
nullptr))
732 self->embedder_api.SendPlatformMessage(
self->engine, &fl_message);
737 "Failed to send platform messages");
738 g_object_unref(task);
741 if (response_handle !=
nullptr) {
742 self->embedder_api.PlatformMessageReleaseResponseHandle(
self->engine,
750 g_return_val_if_fail(FL_IS_ENGINE(
self),
FALSE);
753 return static_cast<GBytes*
>(g_task_propagate_pointer(G_TASK(
result),
error));
759 if (visible && focused) {
761 }
else if (visible) {
771 double pixel_ratio) {
772 g_return_if_fail(FL_IS_ENGINE(
self));
774 if (
self->engine ==
nullptr) {
782 event.pixel_ratio = pixel_ratio;
787 self->embedder_api.SendWindowMetricsEvent(
self->engine, &
event);
796 double scroll_delta_x,
797 double scroll_delta_y,
799 g_return_if_fail(FL_IS_ENGINE(
self));
801 if (
self->engine ==
nullptr) {
807 fl_event.
phase = phase;
811 if (scroll_delta_x != 0 || scroll_delta_y != 0) {
823 self->embedder_api.SendPointerEvent(
self->engine, &fl_event, 1);
835 g_return_if_fail(FL_IS_ENGINE(
self));
837 if (
self->engine ==
nullptr) {
846 fl_event.
phase = phase;
847 fl_event.
pan_x = pan_x;
848 fl_event.
pan_y = pan_y;
857 self->embedder_api.SendPointerEvent(
self->engine, &fl_event, 1);
864 g_return_if_fail(FL_IS_ENGINE(
self));
866 if (
self->engine ==
nullptr) {
877 g_return_if_fail(FL_IS_ENGINE(
self));
879 if (
self->engine ==
nullptr) {
883 const uint8_t* action_data =
nullptr;
884 size_t action_data_length = 0;
885 if (
data !=
nullptr) {
886 action_data =
static_cast<const uint8_t*
>(
887 g_bytes_get_data(
data, &action_data_length));
890 self->embedder_api.DispatchSemanticsAction(
self->engine,
id,
action,
891 action_data, action_data_length);
896 g_return_val_if_fail(FL_IS_ENGINE(
self),
FALSE);
897 return self->embedder_api.MarkExternalTextureFrameAvailable(
903 g_return_val_if_fail(FL_IS_ENGINE(
self),
FALSE);
910 g_return_val_if_fail(FL_IS_ENGINE(
self),
FALSE);
911 return self->embedder_api.UnregisterExternalTexture(
self->engine,
917 g_return_val_if_fail(FL_IS_ENGINE(
self),
nullptr);
918 return self->binary_messenger;
922 g_return_val_if_fail(FL_IS_ENGINE(
self),
nullptr);
923 return self->task_runner;
927 g_return_if_fail(FL_IS_ENGINE(
self));
928 self->embedder_api.RunTask(
self->engine, task);
933 g_return_val_if_fail(FL_IS_ENGINE(
self),
nullptr);
934 return self->texture_registrar;
938 g_return_if_fail(FL_IS_ENGINE(
self));
940 if (
self->engine ==
nullptr) {
944 self->embedder_api.UpdateAccessibilityFeatures(
949 GPtrArray* switches = g_ptr_array_new_with_free_func(g_free);
951 g_ptr_array_add(switches, g_strdup(env_switch.c_str()));
FlutterEngineResult FlutterEngineGetProcAddresses(FlutterEngineProcTable *table)
Gets the table of engine function pointers.
@ kFlutterEngineAOTDataSourceTypeElfPath
FlutterPointerPhase
The phase of the pointer event.
FlutterAccessibilityFeature
@ kFlutterPointerSignalKindScroll
@ kFlutterEngineDisplaysUpdateTypeStartup
void(* FlutterKeyEventCallback)(bool, void *)
#define FLUTTER_ENGINE_VERSION
FlutterPointerDeviceKind
The device type that created a pointer event.
@ kFlutterPointerDeviceKindTrackpad
FlutterSemanticsFlag flags
G_DEFINE_QUARK(fl_binary_messenger_codec_error_quark, fl_binary_messenger_codec_error) G_DECLARE_FINAL_TYPE(FlBinaryMessengerImpl
G_MODULE_EXPORT void fl_binary_messenger_send_on_channel(FlBinaryMessenger *self, const gchar *channel, GBytes *message, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
FlBinaryMessenger * fl_binary_messenger_new(FlEngine *engine)
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)
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)
void fl_engine_send_key_event(FlEngine *self, const FlutterKeyEvent *event, FlutterKeyEventCallback callback, void *user_data)
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_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 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)
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)
FlEngine * fl_engine_new(FlDartProject *project, FlRenderer *renderer)
void fl_engine_send_pointer_pan_zoom_event(FlEngine *self, size_t timestamp, double x, double y, FlutterPointerPhase phase, double pan_x, double pan_y, double scale, double rotation)
static void fl_engine_dispose(GObject *object)
gboolean fl_engine_mark_texture_frame_available(FlEngine *self, int64_t texture_id)
static constexpr const char * kFlutterLifecycleChannel
static FlPluginRegistrar * fl_engine_get_registrar_for_plugin(FlPluginRegistry *registry, const gchar *name)
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_on_pre_engine_restart_handler(FlEngine *self, FlEngineOnPreEngineRestartHandler handler, gpointer user_data, GDestroyNotify destroy_notify)
static uint32_t fl_engine_gl_get_fbo(void *user_data)
gboolean fl_engine_unregister_external_texture(FlEngine *self, int64_t texture_id)
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_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)
static bool fl_engine_gl_present(void *user_data)
void fl_engine_set_update_semantics_handler(FlEngine *self, FlEngineUpdateSemanticsHandler handler, gpointer user_data, GDestroyNotify destroy_notify)
static void set_app_lifecycle_state(FlEngine *self, const flutter::AppLifecycleState state)
void fl_engine_dispatch_semantics_action(FlEngine *self, uint64_t id, FlutterSemanticsAction action, GBytes *data)
GPtrArray * fl_engine_get_switches(FlEngine *self)
static void setup_locales(FlEngine *self)
void fl_engine_send_window_state_event(FlEngine *self, gboolean visible, gboolean focused)
static bool compositor_present_layers_callback(const FlutterLayer **layers, size_t layers_count, void *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)
void fl_engine_execute_task(FlEngine *self, FlutterTask *task)
static bool compositor_collect_backing_store_callback(const FlutterBackingStore *renderer, void *user_data)
void fl_engine_send_window_metrics_event(FlEngine *self, size_t width, size_t height, double pixel_ratio)
G_MODULE_EXPORT FlBinaryMessenger * fl_engine_get_binary_messenger(FlEngine *self)
gboolean fl_engine_start(FlEngine *self, GError **error)
void fl_engine_send_mouse_pointer_event(FlEngine *self, FlutterPointerPhase phase, size_t timestamp, double x, double y, FlutterPointerDeviceKind device_kind, double scroll_delta_x, double scroll_delta_y, int64_t buttons)
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)
GBytes * fl_engine_send_platform_message_finish(FlEngine *self, GAsyncResult *result, GError **error)
void(* FlEngineOnPreEngineRestartHandler)(FlEngine *engine, gpointer user_data)
void(* FlEngineUpdateSemanticsHandler)(FlEngine *engine, const FlutterSemanticsUpdate2 *update, gpointer user_data)
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
FlKeyEvent uint64_t FlKeyResponderAsyncCallback callback
G_MODULE_EXPORT GBytes * fl_message_codec_encode_message(FlMessageCodec *self, FlValue *message, GError **error)
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)
guint32 fl_renderer_get_fbo(FlRenderer *self)
gboolean fl_renderer_present_layers(FlRenderer *self, const FlutterLayer **layers, size_t layers_count)
void fl_renderer_make_resource_current(FlRenderer *self)
void fl_renderer_make_current(FlRenderer *self)
gdouble fl_renderer_get_refresh_rate(FlRenderer *self)
void fl_renderer_clear_current(FlRenderer *self)
gboolean fl_renderer_create_backing_store(FlRenderer *renderer, const FlutterBackingStoreConfig *config, FlutterBackingStore *backing_store_out)
void * fl_renderer_get_proc_address(FlRenderer *self, const char *name)
gboolean fl_renderer_collect_backing_store(FlRenderer *self, const FlutterBackingStore *backing_store)
FlRendererHeadless * fl_renderer_headless_new()
FlSettings * fl_settings_new()
FlSettingsPlugin * fl_settings_plugin_new(FlEngine *engine)
void fl_settings_plugin_start(FlSettingsPlugin *self, FlSettings *settings)
guint const GValue GParamSpec * pspec
G_MODULE_EXPORT FlStringCodec * fl_string_codec_new()
FlTaskRunner * fl_task_runner_new(FlEngine *engine)
void fl_task_runner_post_task(FlTaskRunner *self, FlutterTask task, uint64_t target_time_nanos)
gboolean fl_texture_gl_populate(FlTextureGL *self, uint32_t width, uint32_t height, FlutterOpenGLTexture *opengl_texture, GError **error)
FlTexture * fl_texture_registrar_lookup_texture(FlTextureRegistrar *self, int64_t texture_id)
FlTextureRegistrar * fl_texture_registrar_new(FlEngine *engine)
G_MODULE_EXPORT FlValue * fl_value_new_string(const gchar *value)
typedefG_BEGIN_DECLS struct _FlValue FlValue
constexpr int64_t kFlutterImplicitViewId
constexpr const char * AppLifecycleStateToString(AppLifecycleState state)
DEF_SWITCHES_START aot vmservice shared library name
std::vector< std::string > GetSwitchesFromEnvironment()
FlutterBackingStoreCreateCallback create_backing_store_callback
FlutterLayersPresentCallback present_layers_callback
size_t struct_size
This size of this struct. Must be sizeof(FlutterCompositor).
FlutterBackingStoreCollectCallback collect_backing_store_callback
const FlutterTaskRunnerDescription * render_task_runner
const FlutterTaskRunnerDescription * platform_task_runner
size_t struct_size
The size of this struct. Must be sizeof(FlutterCustomTaskRunners).
size_t struct_size
This size of this struct. Must be sizeof(FlutterDisplay).
FlutterEngineDisplayId display_id
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
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.
FlutterOpenGLRendererConfig open_gl
A batch of updates to semantics nodes and custom actions.
size_t struct_size
The size of this struct. Must be sizeof(FlutterTaskRunnerDescription).
BoolCallback runs_task_on_current_thread_callback
FlutterTaskRunnerPostTaskCallback post_task_callback
size_t struct_size
The size of this struct. Must be sizeof(FlutterWindowMetricsEvent).
FlTaskRunner * task_runner
gpointer update_semantics_handler_data
FlEnginePlatformMessageHandler platform_message_handler
GDestroyNotify platform_message_handler_destroy_notify
gpointer platform_message_handler_data
FlEngineUpdateSemanticsHandler update_semantics_handler
FLUTTER_API_SYMBOL(FlutterEngine) engine
FlBinaryMessenger * binary_messenger
FlSettingsPlugin * settings_plugin
FlEngineOnPreEngineRestartHandler on_pre_engine_restart_handler
GDestroyNotify on_pre_engine_restart_handler_destroy_notify
GDestroyNotify update_semantics_handler_destroy_notify
FlTextureRegistrar * texture_registrar
gpointer on_pre_engine_restart_handler_data
FlutterEngineAOTData aot_data
FlutterEngineProcTable embedder_api
std::shared_ptr< const fml::Mapping > data