Flutter Engine Uber Docs
Docs for the entire Flutter Engine repo.
 
Loading...
Searching...
No Matches
fl_engine.cc File Reference

Go to the source code of this file.

Classes

struct  _FlEngine
 

Enumerations

enum  {
  SIGNAL_ON_PRE_ENGINE_RESTART ,
  SIGNAL_UPDATE_SEMANTICS ,
  LAST_SIGNAL
}
 

Functions

static void fl_engine_plugin_registry_iface_init (FlPluginRegistryInterface *iface)
 
 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 parse_locale (const gchar *locale, gchar **language, gchar **territory, gchar **codeset, gchar **modifier)
 
static void set_renderable (FlEngine *self, int64_t view_id, FlRenderable *renderable)
 Stores a weak reference to the renderable with the given ID.
 
static FlRenderable * get_renderable (FlEngine *self, int64_t view_id)
 
static void remove_renderable (FlEngine *self, int64_t view_id)
 Remove a renderable that no longer exists.
 
static void view_added_cb (const FlutterAddViewResult *result)
 
static void view_removed_cb (const FlutterRemoveViewResult *result)
 
static void free_locale (FlutterLocale *locale)
 
static void setup_locales (FlEngine *self)
 
static bool create_opengl_backing_store (FlEngine *self, const FlutterBackingStoreConfig *config, FlutterBackingStore *backing_store_out)
 
static bool collect_opengl_backing_store (FlEngine *self, const FlutterBackingStore *backing_store)
 
static bool create_software_backing_store (FlEngine *self, const FlutterBackingStoreConfig *config, FlutterBackingStore *backing_store_out)
 
static bool collect_software_backing_store (FlEngine *self, const FlutterBackingStore *backing_store)
 
static bool compositor_create_backing_store_callback (const FlutterBackingStoreConfig *config, FlutterBackingStore *backing_store_out, void *user_data)
 
static bool compositor_collect_backing_store_callback (const FlutterBackingStore *backing_store, void *user_data)
 
static bool compositor_present_view_callback (const FlutterPresentViewInfo *info)
 
static void * fl_engine_gl_proc_resolver (void *user_data, const char *name)
 
static bool fl_engine_gl_make_current (void *user_data)
 
static bool fl_engine_gl_clear_current (void *user_data)
 
static uint32_t fl_engine_gl_get_fbo (void *user_data)
 
static bool fl_engine_gl_make_resource_current (void *user_data)
 
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)
 
static void fl_engine_post_task (FlutterTask task, uint64_t target_time_nanos, void *user_data)
 
static void fl_engine_platform_message_cb (const FlutterPlatformMessage *message, void *user_data)
 
static void fl_engine_update_semantics_cb (const FlutterSemanticsUpdate2 *update, void *user_data)
 
static void setup_keyboard (FlEngine *self)
 
static void fl_engine_on_pre_engine_restart_cb (void *user_data)
 
static void fl_engine_platform_message_response_cb (const uint8_t *data, size_t data_length, void *user_data)
 
static FlPluginRegistrar * fl_engine_get_registrar_for_plugin (FlPluginRegistry *registry, const gchar *name)
 
static void fl_engine_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
 
static void fl_engine_dispose (GObject *object)
 
static void fl_engine_class_init (FlEngineClass *klass)
 
static void fl_engine_init (FlEngine *self)
 
static FlEngine * fl_engine_new_full (FlDartProject *project, FlBinaryMessenger *binary_messenger)
 
FlEngine * fl_engine_for_id (int64_t id)
 
G_MODULE_EXPORT FlEngine * fl_engine_new (FlDartProject *project)
 
FlEngine * fl_engine_new_with_binary_messenger (FlBinaryMessenger *binary_messenger)
 
G_MODULE_EXPORT FlEngine * fl_engine_new_headless (FlDartProject *project)
 
FlutterRendererType fl_engine_get_renderer_type (FlEngine *self)
 
FlOpenGLManager * fl_engine_get_opengl_manager (FlEngine *self)
 
FlDisplayMonitor * fl_engine_get_display_monitor (FlEngine *self)
 
gboolean fl_engine_start (FlEngine *self, GError **error)
 
FlutterEngineProcTablefl_engine_get_embedder_api (FlEngine *self)
 
void fl_engine_notify_display_update (FlEngine *self, const FlutterEngineDisplay *displays, size_t displays_length)
 
void fl_engine_set_implicit_view (FlEngine *self, FlRenderable *renderable)
 
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)
 
gboolean fl_engine_add_view_finish (FlEngine *self, GAsyncResult *result, GError **error)
 
FlRenderable * fl_engine_get_renderable (FlEngine *self, FlutterViewId view_id)
 
void fl_engine_remove_view (FlEngine *self, FlutterViewId view_id, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
 
gboolean fl_engine_remove_view_finish (FlEngine *self, GAsyncResult *result, GError **error)
 
void fl_engine_set_platform_message_handler (FlEngine *self, FlEnginePlatformMessageHandler handler, gpointer user_data, GDestroyNotify destroy_notify)
 
gboolean fl_engine_send_platform_message_response (FlEngine *self, const FlutterPlatformMessageResponseHandle *handle, GBytes *response, GError **error)
 
void fl_engine_send_platform_message (FlEngine *self, const gchar *channel, GBytes *message, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer user_data)
 
GBytes * fl_engine_send_platform_message_finish (FlEngine *self, GAsyncResult *result, GError **error)
 
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_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_send_touch_up_event (FlEngine *self, FlutterViewId view_id, size_t timestamp, double x, double y, int32_t device)
 
void fl_engine_send_touch_down_event (FlEngine *self, FlutterViewId view_id, size_t timestamp, double x, double y, int32_t device)
 
void fl_engine_send_touch_move_event (FlEngine *self, FlutterViewId view_id, size_t timestamp, double x, double y, int32_t device)
 
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_send_touch_remove_event (FlEngine *self, FlutterViewId view_id, size_t timestamp, double x, double y, int32_t device)
 
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 send_key_event_cb (bool handled, void *user_data)
 
void fl_engine_send_key_event (FlEngine *self, const FlutterKeyEvent *event, GCancellable *cancellable, GAsyncReadyCallback callback, gpointer 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)
 
gboolean fl_engine_mark_texture_frame_available (FlEngine *self, int64_t texture_id)
 
gboolean fl_engine_register_external_texture (FlEngine *self, int64_t texture_id)
 
gboolean fl_engine_unregister_external_texture (FlEngine *self, int64_t texture_id)
 
G_MODULE_EXPORT FlBinaryMessenger * fl_engine_get_binary_messenger (FlEngine *self)
 
FlTaskRunner * fl_engine_get_task_runner (FlEngine *self)
 
void fl_engine_execute_task (FlEngine *self, FlutterTask *task)
 
G_MODULE_EXPORT FlTextureRegistrar * fl_engine_get_texture_registrar (FlEngine *self)
 
void fl_engine_update_accessibility_features (FlEngine *self, int32_t flags)
 
void fl_engine_request_app_exit (FlEngine *self)
 
FlKeyboardManager * fl_engine_get_keyboard_manager (FlEngine *self)
 
FlTextInputHandler * fl_engine_get_text_input_handler (FlEngine *self)
 
FlMouseCursorHandler * fl_engine_get_mouse_cursor_handler (FlEngine *self)
 

Variables

static constexpr size_t kPlatformTaskRunnerIdentifier = 1
 
static constexpr int32_t kMousePointerDeviceId = 0
 
static constexpr int32_t kPointerPanZoomDeviceId = 1
 
static guint fl_engine_signals [LAST_SIGNAL]
 

Enumeration Type Documentation

◆ anonymous enum

anonymous enum
Enumerator
SIGNAL_ON_PRE_ENGINE_RESTART 
SIGNAL_UPDATE_SEMANTICS 
LAST_SIGNAL 

Definition at line 117 of file fl_engine.cc.

@ LAST_SIGNAL
Definition fl_engine.cc:117
@ SIGNAL_UPDATE_SEMANTICS
Definition fl_engine.cc:117
@ SIGNAL_ON_PRE_ENGINE_RESTART
Definition fl_engine.cc:117

Function Documentation

◆ collect_opengl_backing_store()

static bool collect_opengl_backing_store ( FlEngine *  self,
const FlutterBackingStore backing_store 
)
static

Definition at line 319 of file fl_engine.cc.

321 {
322 if (!fl_opengl_manager_make_current(self->opengl_manager)) {
323 return false;
324 }
325
326 // OpenGL context is required when destroying #FlFramebuffer.
327 g_object_unref(backing_store->open_gl.framebuffer.user_data);
328 return true;
329}
gboolean fl_opengl_manager_make_current(FlOpenGLManager *self)
FlutterOpenGLBackingStore open_gl
The description of the OpenGL backing store.
Definition embedder.h:2115
FlutterOpenGLFramebuffer framebuffer
Definition embedder.h:1958
void * user_data
User data to be returned on the invocation of the destruction callback.
Definition embedder.h:554

References fl_opengl_manager_make_current(), FlutterOpenGLBackingStore::framebuffer, FlutterBackingStore::open_gl, self, and FlutterOpenGLFramebuffer::user_data.

Referenced by compositor_collect_backing_store_callback().

◆ collect_software_backing_store()

static bool collect_software_backing_store ( FlEngine *  self,
const FlutterBackingStore backing_store 
)
static

Definition at line 355 of file fl_engine.cc.

357 {
358 free(const_cast<void*>(backing_store->software.allocation));
359 return true;
360}
FlutterSoftwareBackingStore software
The description of the software backing store.
Definition embedder.h:2117

References FlutterSoftwareBackingStore::allocation, and FlutterBackingStore::software.

Referenced by compositor_collect_backing_store_callback().

◆ compositor_collect_backing_store_callback()

static bool compositor_collect_backing_store_callback ( const FlutterBackingStore backing_store,
void *  user_data 
)
static

Definition at line 379 of file fl_engine.cc.

381 {
382 FlEngine* self = static_cast<FlEngine*>(user_data);
383 switch (self->renderer_type) {
384 case kOpenGL:
385 return collect_opengl_backing_store(self, backing_store);
386 case kSoftware:
387 return collect_software_backing_store(self, backing_store);
388 default:
389 return false;
390 }
391}
@ kOpenGL
Definition embedder.h:80
@ kSoftware
Definition embedder.h:81
static bool collect_opengl_backing_store(FlEngine *self, const FlutterBackingStore *backing_store)
Definition fl_engine.cc:319
static bool collect_software_backing_store(FlEngine *self, const FlutterBackingStore *backing_store)
Definition fl_engine.cc:355

References collect_opengl_backing_store(), collect_software_backing_store(), kOpenGL, kSoftware, self, and user_data.

Referenced by fl_engine_start().

◆ compositor_create_backing_store_callback()

static bool compositor_create_backing_store_callback ( const FlutterBackingStoreConfig config,
FlutterBackingStore backing_store_out,
void *  user_data 
)
static

Definition at line 363 of file fl_engine.cc.

366 {
367 FlEngine* self = static_cast<FlEngine*>(user_data);
368 switch (self->renderer_type) {
369 case kOpenGL:
370 return create_opengl_backing_store(self, config, backing_store_out);
371 case kSoftware:
372 return create_software_backing_store(self, config, backing_store_out);
373 default:
374 return false;
375 }
376}
static bool create_opengl_backing_store(FlEngine *self, const FlutterBackingStoreConfig *config, FlutterBackingStore *backing_store_out)
Definition fl_engine.cc:282
static bool create_software_backing_store(FlEngine *self, const FlutterBackingStoreConfig *config, FlutterBackingStore *backing_store_out)
Definition fl_engine.cc:331

References create_opengl_backing_store(), create_software_backing_store(), kOpenGL, kSoftware, self, and user_data.

Referenced by fl_engine_start().

◆ compositor_present_view_callback()

static bool compositor_present_view_callback ( const FlutterPresentViewInfo info)
static

Definition at line 394 of file fl_engine.cc.

395 {
396 FlEngine* self = static_cast<FlEngine*>(info->user_data);
397
398 g_autoptr(FlRenderable) renderable = get_renderable(self, info->view_id);
399 if (renderable == nullptr) {
400 return true;
401 }
402
404 return true;
405}
g_autoptr(FlEngine) engine
FlRenderable * renderable
static FlRenderable * get_renderable(FlEngine *self, int64_t view_id)
Definition fl_engine.cc:187
void fl_renderable_present_layers(FlRenderable *self, const FlutterLayer **layers, size_t layers_count)
size_t layers_count
The count of layers.
Definition embedder.h:2208
void * user_data
The |FlutterCompositor.user_data|.
Definition embedder.h:2211
FlutterViewId view_id
The identifier of the target view.
Definition embedder.h:2202
const FlutterLayer ** layers
The layers that should be composited onto the view.
Definition embedder.h:2205

References fl_renderable_present_layers(), g_autoptr(), get_renderable(), FlutterPresentViewInfo::layers, FlutterPresentViewInfo::layers_count, renderable, self, FlutterPresentViewInfo::user_data, and FlutterPresentViewInfo::view_id.

Referenced by fl_engine_start().

◆ create_opengl_backing_store()

static bool create_opengl_backing_store ( FlEngine *  self,
const FlutterBackingStoreConfig config,
FlutterBackingStore backing_store_out 
)
static

Definition at line 282 of file fl_engine.cc.

285 {
286 if (!fl_opengl_manager_make_current(self->opengl_manager)) {
287 return false;
288 }
289
290 GLint sized_format = GL_RGBA8;
291 GLint general_format = GL_RGBA;
292 if (epoxy_has_gl_extension("GL_EXT_texture_format_BGRA8888")) {
293 sized_format = GL_BGRA8_EXT;
294 general_format = GL_BGRA_EXT;
295 }
296
297 FlFramebuffer* framebuffer = fl_framebuffer_new(
298 general_format, config->size.width, config->size.height, FALSE);
299 if (!framebuffer) {
300 g_warning("Failed to create backing store");
301 return false;
302 }
303
304 backing_store_out->type = kFlutterBackingStoreTypeOpenGL;
306 backing_store_out->open_gl.framebuffer.user_data = framebuffer;
307 backing_store_out->open_gl.framebuffer.name =
308 fl_framebuffer_get_id(framebuffer);
309 backing_store_out->open_gl.framebuffer.target = sized_format;
310 backing_store_out->open_gl.framebuffer.destruction_callback = [](void* p) {
311 // Backing store destroyed in fl_compositor_opengl_collect_backing_store(),
312 // set on FlutterCompositor.collect_backing_store_callback during engine
313 // start.
314 };
315
316 return true;
317}
@ kFlutterOpenGLTargetTypeFramebuffer
Definition embedder.h:424
@ kFlutterBackingStoreTypeOpenGL
Definition embedder.h:2089
FlFramebuffer * fl_framebuffer_new(GLint format, size_t width, size_t height, gboolean shareable)
GLuint fl_framebuffer_get_id(FlFramebuffer *self)
bool epoxy_has_gl_extension(const char *extension)
FlutterSize size
The size of the render target the engine expects to render into.
Definition embedder.h:2131
FlutterBackingStoreType type
Specifies the type of backing store.
Definition embedder.h:2109
FlutterOpenGLTargetType type
Definition embedder.h:1952
uint32_t name
The name of the framebuffer.
Definition embedder.h:551
VoidCallback destruction_callback
Definition embedder.h:558
double height
Definition embedder.h:636
double width
Definition embedder.h:635

References FlutterOpenGLFramebuffer::destruction_callback, epoxy_has_gl_extension(), fl_framebuffer_get_id(), fl_framebuffer_new(), fl_opengl_manager_make_current(), FlutterOpenGLBackingStore::framebuffer, FlutterSize::height, kFlutterBackingStoreTypeOpenGL, kFlutterOpenGLTargetTypeFramebuffer, FlutterOpenGLFramebuffer::name, FlutterBackingStore::open_gl, self, FlutterBackingStoreConfig::size, FlutterOpenGLFramebuffer::target, FlutterOpenGLBackingStore::type, FlutterBackingStore::type, FlutterOpenGLFramebuffer::user_data, and FlutterSize::width.

Referenced by compositor_create_backing_store_callback().

◆ create_software_backing_store()

static bool create_software_backing_store ( FlEngine *  self,
const FlutterBackingStoreConfig config,
FlutterBackingStore backing_store_out 
)
static

Definition at line 331 of file fl_engine.cc.

334 {
335 size_t allocation_length = config->size.width * config->size.height * 4;
336 uint8_t* allocation = static_cast<uint8_t*>(malloc(allocation_length));
337 if (allocation == nullptr) {
338 return false;
339 }
340
341 backing_store_out->type = kFlutterBackingStoreTypeSoftware;
342 backing_store_out->software.allocation = allocation;
343 backing_store_out->software.height = config->size.height;
344 backing_store_out->software.row_bytes = config->size.width * 4;
345 backing_store_out->software.user_data = nullptr;
346 backing_store_out->software.destruction_callback = [](void* p) {
347 // Backing store destroyed in
348 // fl_compositor_software_collect_backing_store(), set on
349 // FlutterCompositor.collect_backing_store_callback during engine start.
350 };
351
352 return true;
353}
@ kFlutterBackingStoreTypeSoftware
Specified an software allocation for Flutter to render into using the CPU.
Definition embedder.h:2091
VoidCallback destruction_callback
Definition embedder.h:1979
size_t row_bytes
The number of bytes in a single row of the allocation.
Definition embedder.h:1970
size_t height
The number of rows in the allocation.
Definition embedder.h:1972

References FlutterSoftwareBackingStore::allocation, FlutterSoftwareBackingStore::destruction_callback, FlutterSize::height, FlutterSoftwareBackingStore::height, kFlutterBackingStoreTypeSoftware, FlutterSoftwareBackingStore::row_bytes, FlutterBackingStoreConfig::size, FlutterBackingStore::software, FlutterBackingStore::type, FlutterSoftwareBackingStore::user_data, and FlutterSize::width.

Referenced by compositor_create_backing_store_callback().

◆ fl_engine_add_view()

FlutterViewId fl_engine_add_view ( FlEngine *  engine,
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 
)

fl_engine_add_view: @engine: an #FlEngine. @renderable: the object that will render this view. @min_width: minimum width of view in pixels. @min_height: minimum height of view in pixels. @max_width: maximum width of view in pixels. @max_height: maximum height of view in pixels. @pixel_ratio: scale factor for view. @cancellable: (allow-none): a #GCancellable or NULL. @callback: (scope async): a #GAsyncReadyCallback to call when the view is added. @user_data: (closure): user data to pass to @callback.

Asynchronously add a new view. The returned view ID should not be used until this function completes.

Returns: the ID for the view.

Definition at line 924 of file fl_engine.cc.

933 {
934 g_return_val_if_fail(FL_IS_ENGINE(self), -1);
935
936 g_autoptr(GTask) task = g_task_new(self, cancellable, callback, user_data);
937
938 FlutterViewId view_id = self->next_view_id;
939 self->next_view_id++;
940
942
943 // We don't know which display this view will open on, so set to zero and this
944 // will be updated in a following FlutterWindowMetricsEvent
945 FlutterEngineDisplayId display_id = 0;
946
947 FlutterWindowMetricsEvent metrics = {};
948 metrics.struct_size = sizeof(FlutterWindowMetricsEvent);
949 metrics.width = min_width;
950 metrics.height = min_height;
951 metrics.pixel_ratio = pixel_ratio;
952 metrics.display_id = display_id;
953 metrics.view_id = view_id;
954 metrics.has_constraints = true;
955 metrics.min_width_constraint = min_width;
956 metrics.min_height_constraint = min_height;
957 metrics.max_width_constraint = max_width;
958 metrics.max_height_constraint = max_height;
960 info.struct_size = sizeof(FlutterAddViewInfo);
961 info.view_id = view_id;
962 info.view_metrics = &metrics;
963 info.user_data = g_object_ref(task);
965 FlutterEngineResult result = self->embedder_api.AddView(self->engine, &info);
966 if (result != kSuccess) {
967 g_task_return_new_error(task, fl_engine_error_quark(),
968 FL_ENGINE_ERROR_FAILED, "AddView returned %d",
969 result);
970 // This would have been done in the callback, but that won't occur now.
971 g_object_unref(task);
972 }
973
974 return view_id;
975}
uint64_t FlutterEngineDisplayId
Definition embedder.h:1050
FlutterEngineResult
Definition embedder.h:72
@ kSuccess
Definition embedder.h:73
int64_t FlutterViewId
Definition embedder.h:393
static void view_added_cb(const FlutterAddViewResult *result)
Definition fl_engine.cc:203
static void set_renderable(FlEngine *self, int64_t view_id, FlRenderable *renderable)
Stores a weak reference to the renderable with the given ID.
Definition fl_engine.cc:175
GQuark fl_engine_error_quark(void) G_GNUC_CONST
@ FL_ENGINE_ERROR_FAILED
G_BEGIN_DECLS FlutterViewId view_id
FlutterDesktopBinaryReply callback
FlutterAddViewCallback add_view_callback
Definition embedder.h:1147
FlutterViewId view_id
The identifier for the view to add. This must be unique.
Definition embedder.h:1127
const FlutterWindowMetricsEvent * view_metrics
Definition embedder.h:1132
FlutterEngineDisplayId display_id
The identifier of the display the view is rendering on.
Definition embedder.h:1074
size_t struct_size
The size of this struct. Must be sizeof(FlutterWindowMetricsEvent).
Definition embedder.h:1054
size_t height
Physical height of the window.
Definition embedder.h:1058
int64_t view_id
The view that this event is describing.
Definition embedder.h:1076
double pixel_ratio
Scale factor for the physical screen.
Definition embedder.h:1060
size_t width
Physical width of the window.
Definition embedder.h:1056

References FlutterAddViewInfo::add_view_callback, callback, FlutterWindowMetricsEvent::display_id, FL_ENGINE_ERROR_FAILED, fl_engine_error_quark(), g_autoptr(), FlutterWindowMetricsEvent::has_constraints, FlutterWindowMetricsEvent::height, kSuccess, FlutterWindowMetricsEvent::max_height_constraint, FlutterWindowMetricsEvent::max_width_constraint, FlutterWindowMetricsEvent::min_height_constraint, FlutterWindowMetricsEvent::min_width_constraint, FlutterWindowMetricsEvent::pixel_ratio, renderable, self, set_renderable(), FlutterWindowMetricsEvent::struct_size, FlutterAddViewInfo::struct_size, user_data, FlutterAddViewInfo::user_data, view_added_cb(), FlutterWindowMetricsEvent::view_id, FlutterAddViewInfo::view_id, view_id, FlutterAddViewInfo::view_metrics, and FlutterWindowMetricsEvent::width.

Referenced by fl_view_new_for_engine(), fl_view_new_sized_to_content(), TEST(), TEST(), and TEST().

◆ fl_engine_add_view_finish()

gboolean fl_engine_add_view_finish ( FlEngine *  engine,
GAsyncResult *  result,
GError **  error 
)

fl_engine_add_view_finish: @engine: an #FlEngine.

Returns
: a #GAsyncResult. @error: (allow-none): #GError location to store the error occurring, or NULL to ignore. If error is not NULL, *error must be initialized (typically NULL, but an error from a previous call using GLib error handling is explicitly valid).

Completes request started with fl_engine_add_view().

Returns: TRUE on success.

Definition at line 977 of file fl_engine.cc.

979 {
980 g_return_val_if_fail(FL_IS_ENGINE(self), FALSE);
981 return g_task_propagate_boolean(G_TASK(result), error);
982}
const uint8_t uint32_t uint32_t GError ** error

References error, and self.

Referenced by add_view_cb(), add_view_engine_error_cb(), add_view_error_cb(), and view_added_cb().

◆ fl_engine_class_init()

static void fl_engine_class_init ( FlEngineClass *  klass)
static

Definition at line 640 of file fl_engine.cc.

640 {
641 G_OBJECT_CLASS(klass)->dispose = fl_engine_dispose;
642 G_OBJECT_CLASS(klass)->set_property = fl_engine_set_property;
643
644 g_object_class_install_property(
645 G_OBJECT_CLASS(klass), PROP_BINARY_MESSENGER,
646 g_param_spec_object(
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)));
651
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);
658}
static void fl_engine_dispose(GObject *object)
Definition fl_engine.cc:590
static guint fl_engine_signals[LAST_SIGNAL]
Definition fl_engine.cc:119
static void fl_engine_set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
Definition fl_engine.cc:574

References fl_engine_dispose(), fl_engine_set_property(), fl_engine_signals, SIGNAL_ON_PRE_ENGINE_RESTART, and SIGNAL_UPDATE_SEMANTICS.

◆ fl_engine_dispatch_semantics_action()

void fl_engine_dispatch_semantics_action ( FlEngine *  engine,
FlutterViewId  view_id,
uint64_t  node_id,
FlutterSemanticsAction  action,
GBytes *  data 
)

fl_engine_dispatch_semantics_action: @engine: an #FlEngine. @view_id: the view that the event occured on. @node_id: the semantics action identifier. @action: the action being dispatched. @data: (allow-none): data associated with the action.

Definition at line 1442 of file fl_engine.cc.

1446 {
1447 g_return_if_fail(FL_IS_ENGINE(self));
1448
1449 if (self->engine == nullptr) {
1450 return;
1451 }
1452
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));
1458 }
1459
1462 info.view_id = view_id;
1463 info.node_id = node_id;
1464 info.action = action;
1465 info.data = action_data;
1466 info.data_length = action_data_length;
1467 if (self->embedder_api.SendSemanticsAction(self->engine, &info) != kSuccess) {
1468 g_warning("Failed to send semantics action");
1469 }
1470}
FlutterViewId view_id
The ID of the view that includes the node.
Definition embedder.h:2816
FlutterSemanticsAction action
The semantics action.
Definition embedder.h:2822
size_t data_length
The data length.
Definition embedder.h:2828
uint64_t node_id
The semantics node identifier.
Definition embedder.h:2819
const uint8_t * data
Data associated with the action.
Definition embedder.h:2825

References FlutterSendSemanticsActionInfo::action, action, FlutterSendSemanticsActionInfo::data, FlutterSendSemanticsActionInfo::data_length, kSuccess, FlutterSendSemanticsActionInfo::node_id, self, FlutterSendSemanticsActionInfo::struct_size, FlutterSendSemanticsActionInfo::view_id, and view_id.

Referenced by fl_accessible_node_perform_action_impl(), and TEST().

◆ fl_engine_dispose()

static void fl_engine_dispose ( GObject *  object)
static

Definition at line 590 of file fl_engine.cc.

590 {
591 FlEngine* self = FL_ENGINE(object);
592
593 if (self->engine != nullptr) {
594 if (self->embedder_api.Shutdown(self->engine) != kSuccess) {
595 g_warning("Failed to shutdown Flutter engine");
596 }
597 self->engine = nullptr;
598 }
599
600 if (self->aot_data != nullptr) {
601 if (self->embedder_api.CollectAOTData(self->aot_data) != kSuccess) {
602 g_warning("Failed to send collect AOT data");
603 }
604 self->aot_data = nullptr;
605 }
606
607 fl_binary_messenger_shutdown(self->binary_messenger);
608 fl_texture_registrar_shutdown(self->texture_registrar);
609
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);
623 {
624 g_autoptr(GMutexLocker) locker =
625 g_mutex_locker_new(&self->renderables_mutex);
626 g_clear_pointer(&self->renderables_by_view_id, g_hash_table_unref);
627 }
628 g_mutex_clear(&self->renderables_mutex);
629
630 if (self->platform_message_handler_destroy_notify) {
631 self->platform_message_handler_destroy_notify(
632 self->platform_message_handler_data);
633 }
634 self->platform_message_handler_data = nullptr;
635 self->platform_message_handler_destroy_notify = nullptr;
636
637 G_OBJECT_CLASS(fl_engine_parent_class)->dispose(object);
638}
void fl_binary_messenger_shutdown(FlBinaryMessenger *self)
void fl_texture_registrar_shutdown(FlTextureRegistrar *self)

References fl_binary_messenger_shutdown(), fl_texture_registrar_shutdown(), g_autoptr(), kSuccess, and self.

Referenced by fl_engine_class_init().

◆ fl_engine_execute_task()

void fl_engine_execute_task ( FlEngine *  engine,
FlutterTask task 
)

fl_engine_execute_task: @engine: an #FlEngine. @task: a FlutterTask to execute.

Executes given Flutter task.

Definition at line 1504 of file fl_engine.cc.

1504 {
1505 g_return_if_fail(FL_IS_ENGINE(self));
1506 if (self->embedder_api.RunTask(self->engine, task) != kSuccess) {
1507 g_warning("Failed to run task");
1508 }
1509}

References kSuccess, and self.

Referenced by fl_task_runner_process_expired_tasks_locked().

◆ fl_engine_for_id()

FlEngine * fl_engine_for_id ( int64_t  handle)

fl_engine_for_id: @handle: an engine identifier obtained through PlatformDispatcher.instance.engineId.

Returns Flutter engine associated with the identifier. The identifier must be valid and for a running engine otherwise the behavior is undefined. Must be called from the main thread.

Returns: a #FlEngine or NULL.

Definition at line 724 of file fl_engine.cc.

724 {
725 void* engine = reinterpret_cast<void*>(id);
726 g_return_val_if_fail(FL_IS_ENGINE(engine), nullptr);
727 return FL_ENGINE(engine);
728}
FlutterEngine engine
Definition main.cc:84
const uintptr_t id

References engine, and id.

Referenced by TEST().

◆ fl_engine_get_binary_messenger()

G_MODULE_EXPORT FlBinaryMessenger * fl_engine_get_binary_messenger ( FlEngine *  engine)

fl_engine_get_binary_messenger: @engine: an #FlEngine.

Gets the messenger to communicate with this engine.

Returns: an #FlBinaryMessenger.

Definition at line 1493 of file fl_engine.cc.

1494 {
1495 g_return_val_if_fail(FL_IS_ENGINE(self), nullptr);
1496 return self->binary_messenger;
1497}

References self.

Referenced by fl_accessibility_handler_new(), fl_keyboard_manager_new(), fl_settings_handler_new(), fl_view_get_registrar_for_plugin(), realize_cb(), TEST(), TEST(), TEST(), and TEST().

◆ fl_engine_get_display_monitor()

FlDisplayMonitor * fl_engine_get_display_monitor ( FlEngine *  engine)

fl_engine_get_display_monitor: @engine: an #FlEngine.

Gets the display monitor used by this engine.

Returns: an #FlDisplayMonitor.

Definition at line 754 of file fl_engine.cc.

754 {
755 g_return_val_if_fail(FL_IS_ENGINE(self), nullptr);
756 return self->display_monitor;
757}

References self.

Referenced by handle_geometry_changed(), and TEST().

◆ fl_engine_get_embedder_api()

FlutterEngineProcTable * fl_engine_get_embedder_api ( FlEngine *  engine)

fl_engine_get_embedder_api: @engine: an #FlEngine.

Gets the embedder API proc table, allowing modificiations for unit testing.

Returns: a mutable pointer to the embedder API proc table.

Definition at line 903 of file fl_engine.cc.

903 {
904 return &(self->embedder_api);
905}

References self.

Referenced by TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), and TEST().

◆ fl_engine_get_keyboard_manager()

FlKeyboardManager * fl_engine_get_keyboard_manager ( FlEngine *  engine)

fl_engine_get_keyboard_manager: @engine: an #FlEngine.

Gets the keyboard manager used by this engine.

Returns: an #FlKeyboardManager.

Definition at line 1536 of file fl_engine.cc.

1536 {
1537 g_return_val_if_fail(FL_IS_ENGINE(self), nullptr);
1538 return self->keyboard_manager;
1539}

References self.

Referenced by handle_key_event(), sync_modifier_if_needed(), and TEST().

◆ fl_engine_get_mouse_cursor_handler()

FlMouseCursorHandler * fl_engine_get_mouse_cursor_handler ( FlEngine *  engine)

fl_engine_get_mouse_cursor_handler: @engine: an #FlEngine.

Gets the mouse cursor handler used by this engine.

Returns: an #FlMouseCursorHandler.

Definition at line 1546 of file fl_engine.cc.

1546 {
1547 g_return_val_if_fail(FL_IS_ENGINE(self), nullptr);
1548 return self->mouse_cursor_handler;
1549}

References self.

Referenced by cursor_changed_cb(), fl_view_dispose(), setup_cursor(), and TEST().

◆ fl_engine_get_opengl_manager()

FlOpenGLManager * fl_engine_get_opengl_manager ( FlEngine *  engine)

fl_engine_get_opengl_manager: @engine: an #FlEngine.

Gets the OpenGL manager used by this engine.

Returns: an #FlOpenGLManager.

Definition at line 749 of file fl_engine.cc.

749 {
750 g_return_val_if_fail(FL_IS_ENGINE(self), nullptr);
751 return self->opengl_manager;
752}

References self.

Referenced by realize_cb(), and setup_opengl().

◆ fl_engine_get_registrar_for_plugin()

static FlPluginRegistrar * fl_engine_get_registrar_for_plugin ( FlPluginRegistry *  registry,
const gchar *  name 
)
static

Definition at line 560 of file fl_engine.cc.

562 {
563 FlEngine* self = FL_ENGINE(registry);
564
565 return fl_plugin_registrar_new(nullptr, self->binary_messenger,
566 self->texture_registrar);
567}
FlPluginRegistrar * fl_plugin_registrar_new(FlView *view, FlBinaryMessenger *messenger, FlTextureRegistrar *texture_registrar)

References fl_plugin_registrar_new(), and self.

Referenced by fl_engine_plugin_registry_iface_init().

◆ fl_engine_get_renderable()

FlRenderable * fl_engine_get_renderable ( FlEngine *  engine,
FlutterViewId  view_id 
)

fl_engine_get_renderable: @engine: an #FlEngine. @view_id: ID to check.

Gets the renderable associated with the give view ID.

Returns: (transfer full): a reference to an #FlRenderable or NULL if none for this ID.

Definition at line 984 of file fl_engine.cc.

984 {
985 g_return_val_if_fail(FL_IS_ENGINE(self), nullptr);
986
987 return get_renderable(self, view_id);
988}

References get_renderable(), self, and view_id.

◆ fl_engine_get_renderer_type()

FlutterRendererType fl_engine_get_renderer_type ( FlEngine *  engine)

fl_engine_get_renderer_type: @engine: an #FlEngine.

Gets the rendering type used by this engine.

Returns: type of rendering used.

Definition at line 744 of file fl_engine.cc.

744 {
745 g_return_val_if_fail(FL_IS_ENGINE(self), static_cast<FlutterRendererType>(0));
746 return self->renderer_type;
747}
FlutterRendererType
Definition embedder.h:79

References self.

Referenced by realize_cb().

◆ fl_engine_get_task_runner()

FlTaskRunner * fl_engine_get_task_runner ( FlEngine *  engine)

fl_engine_get_task_runner: @engine: an #FlEngine.

Returns
: a #FlTaskRunner.

Returns: task runner responsible for scheduling Flutter tasks.

Definition at line 1499 of file fl_engine.cc.

1499 {
1500 g_return_val_if_fail(FL_IS_ENGINE(self), nullptr);
1501 return self->task_runner;
1502}

References self.

Referenced by setup_opengl(), setup_software(), and TEST().

◆ fl_engine_get_text_input_handler()

FlTextInputHandler * fl_engine_get_text_input_handler ( FlEngine *  engine)

fl_engine_get_text_input_handler: @engine: an #FlEngine.

Gets the text input handler used by this engine.

Returns: an #FlTextInputHandler.

Definition at line 1541 of file fl_engine.cc.

1541 {
1542 g_return_val_if_fail(FL_IS_ENGINE(self), nullptr);
1543 return self->text_input_handler;
1544}

References self.

Referenced by fl_view_focus_in_event(), and handle_key_event().

◆ fl_engine_get_texture_registrar()

G_MODULE_EXPORT FlTextureRegistrar * fl_engine_get_texture_registrar ( FlEngine *  engine)

fl_engine_get_texture_registrar: @engine: an #FlEngine.

Gets the texture registrar for registering textures.

Returns: an #FlTextureRegistrar.

Definition at line 1511 of file fl_engine.cc.

1512 {
1513 g_return_val_if_fail(FL_IS_ENGINE(self), nullptr);
1514 return self->texture_registrar;
1515}

References self.

Referenced by fl_view_get_registrar_for_plugin().

◆ fl_engine_gl_clear_current()

static bool fl_engine_gl_clear_current ( void *  user_data)
static

Definition at line 418 of file fl_engine.cc.

418 {
419 FlEngine* self = static_cast<FlEngine*>(user_data);
420 return fl_opengl_manager_clear_current(self->opengl_manager);
421}
gboolean fl_opengl_manager_clear_current(FlOpenGLManager *self)

References fl_opengl_manager_clear_current(), self, and user_data.

Referenced by fl_engine_start().

◆ fl_engine_gl_external_texture_frame_callback()

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

Definition at line 434 of file fl_engine.cc.

439 {
440 FlEngine* self = static_cast<FlEngine*>(user_data);
441 if (!self->texture_registrar) {
442 return false;
443 }
444
445 FlTexture* texture =
447 if (texture == nullptr) {
448 g_warning("Unable to find texture %" G_GINT64_FORMAT, texture_id);
449 return false;
450 }
451
452 gboolean result;
453 g_autoptr(GError) error = nullptr;
454 if (FL_IS_TEXTURE_GL(texture)) {
455 result = fl_texture_gl_populate(FL_TEXTURE_GL(texture), width, height,
456 opengl_texture, &error);
457 } else if (FL_IS_PIXEL_BUFFER_TEXTURE(texture)) {
458 result =
459 fl_pixel_buffer_texture_populate(FL_PIXEL_BUFFER_TEXTURE(texture),
460 width, height, opengl_texture, &error);
461 } else {
462 g_warning("Unsupported texture type %" G_GINT64_FORMAT, texture_id);
463 return false;
464 }
465
466 if (!result) {
467 g_warning("%s", error->message);
468 return false;
469 }
470
471 return true;
472}
gboolean fl_pixel_buffer_texture_populate(FlPixelBufferTexture *texture, uint32_t width, uint32_t height, FlutterOpenGLTexture *opengl_texture, GError **error)
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)
FlTexture * texture
int32_t height
int32_t width
int64_t texture_id

References error, fl_pixel_buffer_texture_populate(), fl_texture_gl_populate(), fl_texture_registrar_lookup_texture(), g_autoptr(), height, self, texture, texture_id, user_data, and width.

Referenced by fl_engine_start().

◆ fl_engine_gl_get_fbo()

static uint32_t fl_engine_gl_get_fbo ( void *  user_data)
static

Definition at line 423 of file fl_engine.cc.

423 {
424 // There is only one frame buffer object - always return that.
425 return 0;
426}

Referenced by fl_engine_start().

◆ fl_engine_gl_make_current()

static bool fl_engine_gl_make_current ( void *  user_data)
static

Definition at line 413 of file fl_engine.cc.

413 {
414 FlEngine* self = static_cast<FlEngine*>(user_data);
415 return fl_opengl_manager_make_current(self->opengl_manager);
416}

References fl_opengl_manager_make_current(), self, and user_data.

Referenced by fl_engine_start().

◆ fl_engine_gl_make_resource_current()

static bool fl_engine_gl_make_resource_current ( void *  user_data)
static

Definition at line 428 of file fl_engine.cc.

428 {
429 FlEngine* self = static_cast<FlEngine*>(user_data);
430 return fl_opengl_manager_make_resource_current(self->opengl_manager);
431}
gboolean fl_opengl_manager_make_resource_current(FlOpenGLManager *self)

References fl_opengl_manager_make_resource_current(), self, and user_data.

Referenced by fl_engine_start().

◆ fl_engine_gl_proc_resolver()

static void * fl_engine_gl_proc_resolver ( void *  user_data,
const char *  name 
)
static

Definition at line 409 of file fl_engine.cc.

409 {
410 return reinterpret_cast<void*>(eglGetProcAddress(name));
411}
const char * name
Definition fuchsia.cc:50

References name.

Referenced by fl_engine_start().

◆ fl_engine_init()

static void fl_engine_init ( FlEngine *  self)
static

Definition at line 660 of file fl_engine.cc.

660 {
661 self->thread = g_thread_self();
662
663 self->embedder_api.struct_size = sizeof(FlutterEngineProcTable);
664 if (FlutterEngineGetProcAddresses(&self->embedder_api) != kSuccess) {
665 g_warning("Failed get get engine function pointers");
666 }
667
668 self->opengl_manager = fl_opengl_manager_new();
669
670 self->display_monitor =
672 self->task_runner = fl_task_runner_new(self);
673
674 // Implicit view is 0, so start at 1.
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);
681 free(ref);
682 });
683
684 self->texture_registrar = fl_texture_registrar_new(self);
685}
int32_t value
FlutterEngineResult FlutterEngineGetProcAddresses(FlutterEngineProcTable *table)
Gets the table of engine function pointers.
Definition embedder.cc:3737
FlDisplayMonitor * fl_display_monitor_new(FlEngine *engine, GdkDisplay *display)
FlOpenGLManager * fl_opengl_manager_new()
FlTaskRunner * fl_task_runner_new(FlEngine *engine)
FlTextureRegistrar * fl_texture_registrar_new(FlEngine *engine)
GdkDisplay * gdk_display_get_default()
Definition mock_gtk.cc:66
Function-pointer-based versions of the APIs above.
Definition embedder.h:3746

References fl_display_monitor_new(), fl_opengl_manager_new(), fl_task_runner_new(), fl_texture_registrar_new(), FlutterEngineGetProcAddresses(), gdk_display_get_default(), kSuccess, self, and value.

◆ fl_engine_mark_texture_frame_available()

gboolean fl_engine_mark_texture_frame_available ( FlEngine *  engine,
int64_t  texture_id 
)

fl_engine_mark_texture_frame_available: @engine: an #FlEngine. @texture_id: the identifier of the texture whose frame has been updated.

Tells the Flutter engine that a new texture frame is available for the given texture.

Returns: TRUE on success.

Definition at line 1472 of file fl_engine.cc.

1473 {
1474 g_return_val_if_fail(FL_IS_ENGINE(self), FALSE);
1475 return self->embedder_api.MarkExternalTextureFrameAvailable(
1476 self->engine, texture_id) == kSuccess;
1477}

References kSuccess, self, and texture_id.

Referenced by mark_texture_frame_available().

◆ fl_engine_new()

G_MODULE_EXPORT FlEngine * fl_engine_new ( FlDartProject *  project)

FlEngine:

#FlEngine is an object that contains a running Flutter engine. fl_engine_new: @project: an #FlDartProject.

Creates new Flutter engine.

Returns: a new #FlEngine.

Definition at line 730 of file fl_engine.cc.

730 {
731 return fl_engine_new_full(project, nullptr);
732}
static FlEngine * fl_engine_new_full(FlDartProject *project, FlBinaryMessenger *binary_messenger)
Definition fl_engine.cc:687

References fl_engine_new_full().

Referenced by fl_engine_new_headless(), fl_view_new(), FlAccessibleNodeTest::SetUp(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), and TEST().

◆ fl_engine_new_full()

static FlEngine * fl_engine_new_full ( FlDartProject *  project,
FlBinaryMessenger *  binary_messenger 
)
static

Definition at line 687 of file fl_engine.cc.

688 {
689 g_return_val_if_fail(FL_IS_DART_PROJECT(project), nullptr);
690
691 FlEngine* self = FL_ENGINE(g_object_new(fl_engine_get_type(), nullptr));
692
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) {
696 self->renderer_type = kSoftware;
697 g_warning(
698 "Using the software renderer. Not all features are supported. This is "
699 "not recommended.\n"
700 "\n"
701 "To switch back to the default renderer, unset the "
702 "FLUTTER_LINUX_RENDERER environment variable.");
703 } else {
704 if (renderer != nullptr && strcmp(renderer, "opengl") != 0) {
705 g_warning("Unknown renderer type '%s', defaulting to opengl", renderer);
706 }
707 self->renderer_type = kOpenGL;
708 }
709
710 if (binary_messenger != nullptr) {
711 self->binary_messenger =
712 FL_BINARY_MESSENGER(g_object_ref(binary_messenger));
713 } else {
714 self->binary_messenger = fl_binary_messenger_new(self);
715 }
716 self->keyboard_manager = fl_keyboard_manager_new(self);
717 self->mouse_cursor_handler =
718 fl_mouse_cursor_handler_new(self->binary_messenger);
719 self->accessibility_handler = fl_accessibility_handler_new(self);
720
721 return self;
722}
FlAccessibilityHandler * fl_accessibility_handler_new(FlEngine *engine)
FlBinaryMessenger * fl_binary_messenger_new(FlEngine *engine)
FlKeyboardManager * fl_keyboard_manager_new(FlEngine *engine)
FlMouseCursorHandler * fl_mouse_cursor_handler_new(FlBinaryMessenger *messenger)

References fl_accessibility_handler_new(), fl_binary_messenger_new(), fl_keyboard_manager_new(), fl_mouse_cursor_handler_new(), kOpenGL, kSoftware, and self.

Referenced by fl_engine_new(), and fl_engine_new_with_binary_messenger().

◆ fl_engine_new_headless()

G_MODULE_EXPORT FlEngine * fl_engine_new_headless ( FlDartProject *  project)

fl_engine_new_headless: @project: an #FlDartProject.

Creates new Flutter engine running in headless mode.

Returns: a new #FlEngine.

Definition at line 740 of file fl_engine.cc.

740 {
741 return fl_engine_new(project);
742}
G_MODULE_EXPORT FlEngine * fl_engine_new(FlDartProject *project)
Definition fl_engine.cc:730

References fl_engine_new().

◆ fl_engine_new_with_binary_messenger()

FlEngine * fl_engine_new_with_binary_messenger ( FlBinaryMessenger *  binary_messenger)

fl_engine_new_with_binary_messenger: @binary_messenger: an #FlBinaryMessenger.

Creates a new engine with a custom binary messenger. Used for testing.

Returns: a new #FlEngine.

Definition at line 734 of file fl_engine.cc.

735 {
736 g_autoptr(FlDartProject) project = fl_dart_project_new();
737 return fl_engine_new_full(project, binary_messenger);
738}
G_MODULE_EXPORT FlDartProject * fl_dart_project_new()

References fl_dart_project_new(), fl_engine_new_full(), and g_autoptr().

Referenced by TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), and TEST().

◆ fl_engine_notify_display_update()

void fl_engine_notify_display_update ( FlEngine *  engine,
const FlutterEngineDisplay displays,
size_t  displays_length 
)

fl_engine_notify_display_update: @engine: an #FlEngine. @displays: displays present on the system. @displays_length: length of @displays.

Notify the current displays that are in the system.

Definition at line 907 of file fl_engine.cc.

909 {
910 g_return_if_fail(FL_IS_ENGINE(self));
911
912 FlutterEngineResult result = self->embedder_api.NotifyDisplayUpdate(
914 displays_length);
915 if (result != kSuccess) {
916 g_warning("Failed to notify display update to Flutter engine: %d", result);
917 }
918}
@ kFlutterEngineDisplaysUpdateTypeStartup
Definition embedder.h:2362
std::vector< FlutterEngineDisplay > * displays

References displays, kFlutterEngineDisplaysUpdateTypeStartup, kSuccess, and self.

Referenced by notify_display_update(), and TEST().

◆ fl_engine_on_pre_engine_restart_cb()

static void fl_engine_on_pre_engine_restart_cb ( void *  user_data)
static

Definition at line 541 of file fl_engine.cc.

541 {
542 FlEngine* self = FL_ENGINE(user_data);
543
545
547}
static void setup_keyboard(FlEngine *self)
Definition fl_engine.cc:517

References fl_engine_signals, self, setup_keyboard(), SIGNAL_ON_PRE_ENGINE_RESTART, and user_data.

Referenced by fl_engine_start().

◆ fl_engine_platform_message_cb()

static void fl_engine_platform_message_cb ( const FlutterPlatformMessage message,
void *  user_data 
)
static

Definition at line 490 of file fl_engine.cc.

491 {
492 FlEngine* self = FL_ENGINE(user_data);
493
494 gboolean handled = FALSE;
495 if (self->platform_message_handler != nullptr) {
496 g_autoptr(GBytes) data =
497 g_bytes_new(message->message, message->message_size);
498 handled = self->platform_message_handler(
499 self, message->channel, data, message->response_handle,
500 self->platform_message_handler_data);
501 }
502
503 if (!handled) {
505 nullptr, nullptr);
506 }
507}
const char * message
gboolean fl_engine_send_platform_message_response(FlEngine *self, const FlutterPlatformMessageResponseHandle *handle, GBytes *response, GError **error)
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot data
Definition switch_defs.h:36

References fl_engine_send_platform_message_response(), g_autoptr(), message, self, and user_data.

Referenced by fl_engine_start().

◆ fl_engine_platform_message_response_cb()

static void fl_engine_platform_message_response_cb ( const uint8_t *  data,
size_t  data_length,
void *  user_data 
)
static

Definition at line 551 of file fl_engine.cc.

553 {
554 g_autoptr(GTask) task = G_TASK(user_data);
555 g_task_return_pointer(task, g_bytes_new(data, data_length),
556 reinterpret_cast<GDestroyNotify>(g_bytes_unref));
557}

References g_autoptr(), and user_data.

Referenced by fl_engine_send_platform_message().

◆ fl_engine_plugin_registry_iface_init()

static void fl_engine_plugin_registry_iface_init ( FlPluginRegistryInterface *  iface)
static

Definition at line 569 of file fl_engine.cc.

570 {
571 iface->get_registrar_for_plugin = fl_engine_get_registrar_for_plugin;
572}
static FlPluginRegistrar * fl_engine_get_registrar_for_plugin(FlPluginRegistry *registry, const gchar *name)
Definition fl_engine.cc:560

References fl_engine_get_registrar_for_plugin().

◆ fl_engine_post_task()

static void fl_engine_post_task ( FlutterTask  task,
uint64_t  target_time_nanos,
void *  user_data 
)
static

Definition at line 481 of file fl_engine.cc.

483 {
484 FlEngine* self = static_cast<FlEngine*>(user_data);
485
486 fl_task_runner_post_flutter_task(self->task_runner, task, target_time_nanos);
487}
void fl_task_runner_post_flutter_task(FlTaskRunner *self, FlutterTask task, uint64_t target_time_nanos)

References fl_task_runner_post_flutter_task(), self, and user_data.

Referenced by fl_engine_start().

◆ fl_engine_register_external_texture()

gboolean fl_engine_register_external_texture ( FlEngine *  engine,
int64_t  texture_id 
)

fl_engine_register_external_texture: @engine: an #FlEngine. @texture_id: the identifier of the texture that is available.

Tells the Flutter engine that a new external texture is available.

Returns: TRUE on success.

Definition at line 1479 of file fl_engine.cc.

1480 {
1481 g_return_val_if_fail(FL_IS_ENGINE(self), FALSE);
1482 return self->embedder_api.RegisterExternalTexture(self->engine, texture_id) ==
1483 kSuccess;
1484}

References kSuccess, self, and texture_id.

Referenced by register_texture().

◆ fl_engine_remove_view()

void fl_engine_remove_view ( FlEngine *  engine,
FlutterViewId  view_id,
GCancellable *  cancellable,
GAsyncReadyCallback  callback,
gpointer  user_data 
)

fl_engine_remove_view: @engine: an #FlEngine. @view_id: ID to remove. @cancellable: (allow-none): a #GCancellable or NULL. @callback: (scope async): a #GAsyncReadyCallback to call when the view is added. @user_data: (closure): user data to pass to @callback.

Removes a view previously added with fl_engine_add_view().

Definition at line 990 of file fl_engine.cc.

994 {
995 g_return_if_fail(FL_IS_ENGINE(self));
996
998
999 g_autoptr(GTask) task = g_task_new(self, cancellable, callback, user_data);
1000
1002 info.struct_size = sizeof(FlutterRemoveViewInfo);
1003 info.view_id = view_id;
1004 info.user_data = g_object_ref(task);
1006 FlutterEngineResult result =
1007 self->embedder_api.RemoveView(self->engine, &info);
1008 if (result != kSuccess) {
1009 g_task_return_new_error(task, fl_engine_error_quark(),
1010 FL_ENGINE_ERROR_FAILED, "RemoveView returned %d",
1011 result);
1012 // This would have been done in the callback, but that won't occur now.
1013 g_object_unref(task);
1014 }
1015}
static void remove_renderable(FlEngine *self, int64_t view_id)
Remove a renderable that no longer exists.
Definition fl_engine.cc:198
static void view_removed_cb(const FlutterRemoveViewResult *result)
Definition fl_engine.cc:214
FlutterRemoveViewCallback remove_view_callback
Definition embedder.h:1195
FlutterViewId view_id
Definition embedder.h:1178

References callback, FL_ENGINE_ERROR_FAILED, fl_engine_error_quark(), g_autoptr(), kSuccess, remove_renderable(), FlutterRemoveViewInfo::remove_view_callback, self, FlutterRemoveViewInfo::struct_size, user_data, FlutterRemoveViewInfo::user_data, FlutterRemoveViewInfo::view_id, view_id, and view_removed_cb().

Referenced by fl_view_dispose(), TEST(), TEST(), and TEST().

◆ fl_engine_remove_view_finish()

gboolean fl_engine_remove_view_finish ( FlEngine *  engine,
GAsyncResult *  result,
GError **  error 
)

fl_engine_remove_view_finish: @engine: an #FlEngine.

Returns
: a #GAsyncResult. @error: (allow-none): #GError location to store the error occurring, or NULL to ignore. If error is not NULL, *error must be initialized (typically NULL, but an error from a previous call using GLib error handling is explicitly valid).

Completes request started with fl_engine_remove_view().

Returns: TRUE on succcess.

Definition at line 1017 of file fl_engine.cc.

1019 {
1020 g_return_val_if_fail(FL_IS_ENGINE(self), FALSE);
1021 return g_task_propagate_boolean(G_TASK(result), error);
1022}

References error, and self.

Referenced by remove_view_cb(), remove_view_engine_error_cb(), and remove_view_error_cb().

◆ fl_engine_request_app_exit()

void fl_engine_request_app_exit ( FlEngine *  engine)

fl_engine_request_app_exit: @engine: an #FlEngine.

Request the application exits.

Definition at line 1531 of file fl_engine.cc.

1531 {
1532 g_return_if_fail(FL_IS_ENGINE(self));
1533 fl_platform_handler_request_app_exit(self->platform_handler);
1534}
void fl_platform_handler_request_app_exit(FlPlatformHandler *self)

References fl_platform_handler_request_app_exit(), and self.

Referenced by window_delete_event_cb().

◆ fl_engine_runs_task_on_current_thread()

static bool fl_engine_runs_task_on_current_thread ( void *  user_data)
static

Definition at line 475 of file fl_engine.cc.

475 {
476 FlEngine* self = static_cast<FlEngine*>(user_data);
477 return self->thread == g_thread_self();
478}

References self, and user_data.

Referenced by fl_engine_start().

◆ fl_engine_send_key_event()

void fl_engine_send_key_event ( FlEngine *  engine,
const FlutterKeyEvent event,
GCancellable *  cancellable,
GAsyncReadyCallback  callback,
gpointer  user_data 
)

fl_engine_send_key_event: @engine: an #FlEngine. @event: key event to send. @cancellable: (allow-none): a #GCancellable or NULL. @callback: (scope async): a #GAsyncReadyCallback to call when the request is satisfied. @user_data: (closure): user data to pass to @callback.

Send a key event to the engine.

Definition at line 1402 of file fl_engine.cc.

1406 {
1407 g_return_if_fail(FL_IS_ENGINE(self));
1408
1409 g_autoptr(GTask) task = g_task_new(self, cancellable, callback, user_data);
1410
1411 if (self->engine == nullptr) {
1412 g_task_return_new_error(task, fl_engine_error_quark(),
1413 FL_ENGINE_ERROR_FAILED, "No engine");
1414 return;
1415 }
1416
1417 if (self->embedder_api.SendKeyEvent(self->engine, event, send_key_event_cb,
1418 g_object_ref(task)) != kSuccess) {
1419 g_task_return_new_error(task, fl_engine_error_quark(),
1420 FL_ENGINE_ERROR_FAILED, "Failed to send key event");
1421 g_object_unref(task);
1422 }
1423}
static void send_key_event_cb(bool handled, void *user_data)

References callback, FL_ENGINE_ERROR_FAILED, fl_engine_error_quark(), g_autoptr(), kSuccess, self, send_key_event_cb(), and user_data.

Referenced by fl_key_embedder_responder_handle_event(), fl_key_embedder_responder_handle_event_impl(), synthesize_simple_event(), TEST(), TEST(), and TEST().

◆ fl_engine_send_key_event_finish()

gboolean fl_engine_send_key_event_finish ( FlEngine *  engine,
GAsyncResult *  result,
gboolean *  handled,
GError **  error 
)

fl_engine_send_key_event_finish: @engine: an #FlEngine.

Returns
: a #GAsyncResult. @handled: location to write if this event was handled by the engine. @error: (allow-none): #GError location to store the error occurring, or NULL to ignore. If error is not NULL, *error must be initialized (typically NULL, but an error from a previous call using GLib error handling is explicitly valid).

Completes request started with fl_engine_send_key_event().

Returns: TRUE on success.

Definition at line 1425 of file fl_engine.cc.

1428 {
1429 g_return_val_if_fail(FL_IS_ENGINE(self), FALSE);
1430 g_return_val_if_fail(g_task_is_valid(result, self), FALSE);
1431
1432 g_autofree gboolean* return_value =
1433 static_cast<gboolean*>(g_task_propagate_pointer(G_TASK(result), error));
1434 if (return_value == nullptr) {
1435 return FALSE;
1436 }
1437
1438 *handled = *return_value;
1439 return TRUE;
1440}
return TRUE

References error, self, and TRUE.

Referenced by TEST(), TEST(), and TEST().

◆ fl_engine_send_mouse_pointer_event()

void fl_engine_send_mouse_pointer_event ( FlEngine *  engine,
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 
)

fl_engine_send_mouse_pointer_event: @engine: an #FlEngine. @view_id: the view that the event occured on. @phase: mouse phase. @timestamp: time when event occurred in microseconds. @x: x location of mouse cursor. @y: y location of mouse cursor. @device_kind: kind of pointing device. @scroll_delta_x: x offset of scroll. @scroll_delta_y: y offset of scroll. @buttons: buttons that are pressed.

Sends a mouse pointer event to the engine.

Definition at line 1178 of file fl_engine.cc.

1187 {
1188 g_return_if_fail(FL_IS_ENGINE(self));
1189
1190 if (self->engine == nullptr) {
1191 return;
1192 }
1193
1194 FlutterPointerEvent fl_event = {};
1195 fl_event.struct_size = sizeof(fl_event);
1196 fl_event.phase = phase;
1197 fl_event.timestamp = timestamp;
1198 fl_event.x = x;
1199 fl_event.y = y;
1200 if (scroll_delta_x != 0 || scroll_delta_y != 0) {
1202 }
1203 fl_event.scroll_delta_x = scroll_delta_x;
1204 fl_event.scroll_delta_y = scroll_delta_y;
1205 fl_event.device_kind = device_kind;
1206 fl_event.buttons = buttons;
1207 fl_event.device = kMousePointerDeviceId;
1208 fl_event.view_id = view_id;
1209 if (self->embedder_api.SendPointerEvent(self->engine, &fl_event, 1) !=
1210 kSuccess) {
1211 g_warning("Failed to send pointer event");
1212 }
1213}
int32_t x
@ kFlutterPointerSignalKindScroll
Definition embedder.h:1331
static constexpr int32_t kMousePointerDeviceId
Definition fl_engine.cc:35
double y
double scroll_delta_y
The y offset of the scroll in physical pixels.
Definition embedder.h:1355
int64_t buttons
The buttons currently pressed, if any.
Definition embedder.h:1363
size_t struct_size
The size of this struct. Must be sizeof(FlutterPointerEvent).
Definition embedder.h:1338
FlutterViewId view_id
The identifier of the view that received the pointer event.
Definition embedder.h:1373
FlutterPointerSignalKind signal_kind
Definition embedder.h:1351
double scroll_delta_x
The x offset of the scroll in physical pixels.
Definition embedder.h:1353
double y
The y coordinate of the pointer event in physical pixels.
Definition embedder.h:1347
double x
The x coordinate of the pointer event in physical pixels.
Definition embedder.h:1345
FlutterPointerDeviceKind device_kind
Definition embedder.h:1361
FlutterPointerPhase phase
Definition embedder.h:1339

References FlutterPointerEvent::buttons, FlutterPointerEvent::device, FlutterPointerEvent::device_kind, kFlutterPointerSignalKindScroll, kMousePointerDeviceId, kSuccess, FlutterPointerEvent::phase, FlutterPointerEvent::scroll_delta_x, FlutterPointerEvent::scroll_delta_y, self, FlutterPointerEvent::signal_kind, FlutterPointerEvent::struct_size, FlutterPointerEvent::timestamp, FlutterPointerEvent::view_id, view_id, x, FlutterPointerEvent::x, FlutterPointerEvent::y, and y.

Referenced by ensure_pointer_added(), fl_pointer_manager_handle_button_press(), fl_pointer_manager_handle_button_release(), fl_pointer_manager_handle_leave(), fl_pointer_manager_handle_motion(), fl_scrolling_manager_handle_scroll_event(), and TEST().

◆ fl_engine_send_platform_message()

void fl_engine_send_platform_message ( FlEngine *  engine,
const gchar *  channel,
GBytes *  message,
GCancellable *  cancellable,
GAsyncReadyCallback  callback,
gpointer  user_data 
)

fl_engine_send_platform_message: @engine: an #FlEngine. @channel: channel to send to. @message: (allow-none): message buffer to send or NULL for an empty message @cancellable: (allow-none): a #GCancellable or NULL. @callback: (scope async): a #GAsyncReadyCallback to call when the request is satisfied. @user_data: (closure): user data to pass to @callback.

Asynchronously sends a platform message.

Definition at line 1075 of file fl_engine.cc.

1080 {
1081 g_return_if_fail(FL_IS_ENGINE(self));
1082
1083 GTask* task = nullptr;
1084 FlutterPlatformMessageResponseHandle* response_handle = nullptr;
1085 if (callback != nullptr) {
1086 task = g_task_new(self, cancellable, callback, user_data);
1087
1088 if (self->engine == nullptr) {
1089 g_task_return_new_error(task, fl_engine_error_quark(),
1090 FL_ENGINE_ERROR_FAILED, "No engine to send to");
1091 g_object_unref(task);
1092 return;
1093 }
1094
1095 FlutterEngineResult result =
1096 self->embedder_api.PlatformMessageCreateResponseHandle(
1098 &response_handle);
1099 if (result != kSuccess) {
1100 g_task_return_new_error(task, fl_engine_error_quark(),
1102 "Failed to create response handle");
1103 g_object_unref(task);
1104 return;
1105 }
1106 } else if (self->engine == nullptr) {
1107 return;
1108 }
1109
1110 FlutterPlatformMessage fl_message = {};
1111 fl_message.struct_size = sizeof(fl_message);
1112 fl_message.channel = channel;
1113 fl_message.message =
1114 message != nullptr
1115 ? static_cast<const uint8_t*>(g_bytes_get_data(message, nullptr))
1116 : nullptr;
1117 fl_message.message_size = message != nullptr ? g_bytes_get_size(message) : 0;
1118 fl_message.response_handle = response_handle;
1119 FlutterEngineResult result =
1120 self->embedder_api.SendPlatformMessage(self->engine, &fl_message);
1121
1122 if (result != kSuccess && task != nullptr) {
1123 g_task_return_new_error(task, fl_engine_error_quark(),
1125 "Failed to send platform messages");
1126 g_object_unref(task);
1127 }
1128
1129 if (response_handle != nullptr) {
1130 if (self->embedder_api.PlatformMessageReleaseResponseHandle(
1131 self->engine, response_handle) != kSuccess) {
1132 g_warning("Failed to release response handle");
1133 }
1134 }
1135}
static void fl_engine_platform_message_response_cb(const uint8_t *data, size_t data_length, void *user_data)
Definition fl_engine.cc:551
const gchar * channel
size_t struct_size
The size of this struct. Must be sizeof(FlutterPlatformMessage).
Definition embedder.h:1474
const FlutterPlatformMessageResponseHandle * response_handle
Definition embedder.h:1484
const char * channel
Definition embedder.h:1475
const uint8_t * message
Definition embedder.h:1476

References callback, FlutterPlatformMessage::channel, channel, FL_ENGINE_ERROR_FAILED, fl_engine_error_quark(), fl_engine_platform_message_response_cb(), kSuccess, FlutterPlatformMessage::message, message, FlutterPlatformMessage::message_size, FlutterPlatformMessage::response_handle, self, FlutterPlatformMessage::struct_size, and user_data.

Referenced by send_on_channel(), and TEST().

◆ fl_engine_send_platform_message_finish()

GBytes * fl_engine_send_platform_message_finish ( FlEngine *  engine,
GAsyncResult *  result,
GError **  error 
)

fl_engine_send_platform_message_finish: @engine: an #FlEngine.

Returns
: a #GAsyncResult. @error: (allow-none): #GError location to store the error occurring, or NULL to ignore. If error is not NULL, *error must be initialized (typically NULL, but an error from a previous call using GLib error handling is explicitly valid).

Completes request started with fl_engine_send_platform_message().

Returns: message response on success or NULL on error.

Definition at line 1137 of file fl_engine.cc.

1139 {
1140 g_return_val_if_fail(FL_IS_ENGINE(self), FALSE);
1141 g_return_val_if_fail(g_task_is_valid(result, self), FALSE);
1142
1143 return static_cast<GBytes*>(g_task_propagate_pointer(G_TASK(result), error));
1144}

References error, and self.

Referenced by send_on_channel_finish().

◆ fl_engine_send_platform_message_response()

gboolean fl_engine_send_platform_message_response ( FlEngine *  engine,
const FlutterPlatformMessageResponseHandle handle,
GBytes *  response,
GError **  error 
)

fl_engine_send_platform_message_response: @engine: an #FlEngine. @handle: handle that was provided in FlEnginePlatformMessageHandler. @response: (allow-none): response to send or NULL for an empty response. @error: (allow-none): #GError location to store the error occurring, or NULL to ignore. If error is not NULL, *error must be initialized (typically NULL, but an error from a previous call using GLib error handling is explicitly valid).

Responds to a platform message.

Returns: TRUE on success.

Definition at line 1043 of file fl_engine.cc.

1047 {
1048 g_return_val_if_fail(FL_IS_ENGINE(self), FALSE);
1049 g_return_val_if_fail(handle != nullptr, FALSE);
1050
1051 if (self->engine == nullptr) {
1053 "No engine to send response to");
1054 return FALSE;
1055 }
1056
1057 gsize data_length = 0;
1058 const uint8_t* data = nullptr;
1059 if (response != nullptr) {
1060 data =
1061 static_cast<const uint8_t*>(g_bytes_get_data(response, &data_length));
1062 }
1063 FlutterEngineResult result = self->embedder_api.SendPlatformMessageResponse(
1064 self->engine, handle, data, data_length);
1065
1066 if (result != kSuccess) {
1068 "Failed to send platform message response");
1069 return FALSE;
1070 }
1071
1072 return TRUE;
1073}

References error, FL_ENGINE_ERROR_FAILED, fl_engine_error_quark(), kSuccess, self, and TRUE.

Referenced by fl_engine_platform_message_cb(), send_response(), and TEST().

◆ fl_engine_send_pointer_pan_zoom_event()

void fl_engine_send_pointer_pan_zoom_event ( FlEngine *  engine,
FlutterViewId  view_id,
size_t  timestamp,
double  x,
double  y,
FlutterPointerPhase  phase,
double  pan_x,
double  pan_y,
double  scale,
double  rotation 
)

fl_engine_send_pointer_pan_zoom_event: @engine: an #FlEngine. @view_id: the view that the event occured on. @timestamp: time when event occurred in microseconds. @x: x location of mouse cursor. @y: y location of mouse cursor. @phase: mouse phase. @pan_x: x offset of the pan/zoom in pixels. @pan_y: y offset of the pan/zoom in pixels. @scale: scale of the pan/zoom. @rotation: rotation of the pan/zoom in radians.

Sends a pan/zoom pointer event to the engine.

Definition at line 1360 of file fl_engine.cc.

1369 {
1370 g_return_if_fail(FL_IS_ENGINE(self));
1371
1372 if (self->engine == nullptr) {
1373 return;
1374 }
1375
1376 FlutterPointerEvent fl_event = {};
1377 fl_event.struct_size = sizeof(fl_event);
1378 fl_event.timestamp = timestamp;
1379 fl_event.x = x;
1380 fl_event.y = y;
1381 fl_event.phase = phase;
1382 fl_event.pan_x = pan_x;
1383 fl_event.pan_y = pan_y;
1384 fl_event.scale = scale;
1385 fl_event.rotation = rotation;
1388 fl_event.view_id = view_id;
1389 if (self->embedder_api.SendPointerEvent(self->engine, &fl_event, 1) !=
1390 kSuccess) {
1391 g_warning("Failed to send pointer event");
1392 }
1393}
@ kFlutterPointerDeviceKindTrackpad
Definition embedder.h:1313
static constexpr int32_t kPointerPanZoomDeviceId
Definition fl_engine.cc:36
double scale
The scale of the pan/zoom, where 1.0 is the initial scale.
Definition embedder.h:1369
double rotation
The rotation of the pan/zoom in radians, where 0.0 is the initial angle.
Definition embedder.h:1371
double pan_x
The x offset of the pan/zoom in physical pixels.
Definition embedder.h:1365
double pan_y
The y offset of the pan/zoom in physical pixels.
Definition embedder.h:1367

References FlutterPointerEvent::device, FlutterPointerEvent::device_kind, kFlutterPointerDeviceKindTrackpad, kPointerPanZoomDeviceId, kSuccess, FlutterPointerEvent::pan_x, FlutterPointerEvent::pan_y, FlutterPointerEvent::phase, FlutterPointerEvent::rotation, FlutterPointerEvent::scale, self, FlutterPointerEvent::struct_size, FlutterPointerEvent::timestamp, FlutterPointerEvent::view_id, view_id, x, FlutterPointerEvent::x, FlutterPointerEvent::y, and y.

Referenced by fl_scrolling_manager_handle_rotation_begin(), fl_scrolling_manager_handle_rotation_end(), fl_scrolling_manager_handle_rotation_update(), fl_scrolling_manager_handle_scroll_event(), fl_scrolling_manager_handle_zoom_begin(), fl_scrolling_manager_handle_zoom_end(), fl_scrolling_manager_handle_zoom_update(), and TEST().

◆ fl_engine_send_touch_add_event()

void fl_engine_send_touch_add_event ( FlEngine *  engine,
FlutterViewId  view_id,
size_t  timestamp,
double  x,
double  y,
int32_t  device 
)

fl_engine_send_touch_add_event: @engine: an #FlEngine. @view_id: the view that the event occured on. @timestamp: time when event occurred in microseconds. @x: x location of mouse cursor. @y: y location of mouse cursor. @device: device id.

Sends a touch add event to the engine.

Definition at line 1302 of file fl_engine.cc.

1307 {
1308 g_return_if_fail(FL_IS_ENGINE(self));
1309
1310 if (self->engine == nullptr) {
1311 return;
1312 }
1313
1314 FlutterPointerEvent event;
1315 event.timestamp = timestamp;
1316 event.x = x;
1317 event.y = y;
1318 event.device_kind = kFlutterPointerDeviceKindTouch;
1319 event.device = device;
1320 event.buttons = 0;
1321 event.view_id = view_id;
1322 event.phase = FlutterPointerPhase::kAdd;
1323 event.struct_size = sizeof(event);
1324
1325 if (self->embedder_api.SendPointerEvent(self->engine, &event, 1) !=
1326 kSuccess) {
1327 g_warning("Failed to send pointer event");
1328 }
1329}
@ kAdd
Definition embedder.h:1292
@ kFlutterPointerDeviceKindTouch
Definition embedder.h:1311
VkDevice device
Definition main.cc:69

References device, kAdd, kFlutterPointerDeviceKindTouch, kSuccess, self, FlutterPointerEvent::timestamp, view_id, x, and y.

Referenced by ensure_touch_added().

◆ fl_engine_send_touch_down_event()

void fl_engine_send_touch_down_event ( FlEngine *  engine,
FlutterViewId  view_id,
size_t  timestamp,
double  x,
double  y,
int32_t  device 
)

fl_engine_send_touch_down_event: @engine: an #FlEngine. @view_id: the view that the event occured on. @timestamp: time when event occurred in microseconds. @x: x location of mouse cursor. @y: y location of mouse cursor. @device: device id.

Sends a touch down event to the engine.

Definition at line 1244 of file fl_engine.cc.

1249 {
1250 g_return_if_fail(FL_IS_ENGINE(self));
1251
1252 if (self->engine == nullptr) {
1253 return;
1254 }
1255
1256 FlutterPointerEvent event;
1257 event.timestamp = timestamp;
1258 event.x = x;
1259 event.y = y;
1260 event.device_kind = kFlutterPointerDeviceKindTouch;
1261 event.device = device;
1263 event.view_id = view_id;
1264 event.phase = FlutterPointerPhase::kDown;
1265 event.struct_size = sizeof(event);
1266
1267 if (self->embedder_api.SendPointerEvent(self->engine, &event, 1) !=
1268 kSuccess) {
1269 g_warning("Failed to send pointer event");
1270 }
1271}
@ kDown
Definition embedder.h:1282
@ kFlutterPointerButtonMousePrimary
Definition embedder.h:1319

References device, kDown, kFlutterPointerButtonMousePrimary, kFlutterPointerDeviceKindTouch, kSuccess, self, FlutterPointerEvent::timestamp, view_id, x, and y.

Referenced by fl_touch_manager_handle_touch_event().

◆ fl_engine_send_touch_move_event()

void fl_engine_send_touch_move_event ( FlEngine *  engine,
FlutterViewId  view_id,
size_t  timestamp,
double  x,
double  y,
int32_t  device 
)

fl_engine_send_touch_move_event: @engine: an #FlEngine. @view_id: the view that the event occured on. @timestamp: time when event occurred in microseconds. @x: x location of mouse cursor. @y: y location of mouse cursor. @device: device id.

Sends a touch move event to the engine.

Definition at line 1273 of file fl_engine.cc.

1278 {
1279 g_return_if_fail(FL_IS_ENGINE(self));
1280
1281 if (self->engine == nullptr) {
1282 return;
1283 }
1284
1285 FlutterPointerEvent event;
1286 event.timestamp = timestamp;
1287 event.x = x;
1288 event.y = y;
1289 event.device_kind = kFlutterPointerDeviceKindTouch;
1290 event.device = device;
1292 event.view_id = view_id;
1293 event.phase = FlutterPointerPhase::kMove;
1294 event.struct_size = sizeof(event);
1295
1296 if (self->embedder_api.SendPointerEvent(self->engine, &event, 1) !=
1297 kSuccess) {
1298 g_warning("Failed to send pointer event");
1299 }
1300}
@ kMove
Definition embedder.h:1287

References device, kFlutterPointerButtonMousePrimary, kFlutterPointerDeviceKindTouch, kMove, kSuccess, self, FlutterPointerEvent::timestamp, view_id, x, and y.

Referenced by fl_touch_manager_handle_touch_event().

◆ fl_engine_send_touch_remove_event()

void fl_engine_send_touch_remove_event ( FlEngine *  engine,
FlutterViewId  view_id,
size_t  timestamp,
double  x,
double  y,
int32_t  device 
)

fl_engine_send_touch_remove_event: @engine: an #FlEngine. @view_id: the view that the event occured on. @timestamp: time when event occurred in microseconds. @x: x location of mouse cursor. @y: y location of mouse cursor. @device: device id.

Sends a touch remove event to the engine.

Definition at line 1331 of file fl_engine.cc.

1336 {
1337 g_return_if_fail(FL_IS_ENGINE(self));
1338
1339 if (self->engine == nullptr) {
1340 return;
1341 }
1342
1343 FlutterPointerEvent event;
1344 event.timestamp = timestamp;
1345 event.x = x;
1346 event.y = y;
1347 event.device_kind = kFlutterPointerDeviceKindTouch;
1348 event.device = device;
1349 event.buttons = 0;
1350 event.view_id = view_id;
1351 event.phase = FlutterPointerPhase::kRemove;
1352 event.struct_size = sizeof(event);
1353
1354 if (self->embedder_api.SendPointerEvent(self->engine, &event, 1) !=
1355 kSuccess) {
1356 g_warning("Failed to send pointer event");
1357 }
1358}
@ kRemove
Definition embedder.h:1297

References device, kFlutterPointerDeviceKindTouch, kRemove, kSuccess, self, FlutterPointerEvent::timestamp, view_id, x, and y.

Referenced by fl_touch_manager_handle_touch_event().

◆ fl_engine_send_touch_up_event()

void fl_engine_send_touch_up_event ( FlEngine *  engine,
FlutterViewId  view_id,
size_t  timestamp,
double  x,
double  y,
int32_t  device 
)

fl_engine_send_touch_up_event: @engine: an #FlEngine. @view_id: the view that the event occured on. @timestamp: time when event occurred in microseconds. @x: x location of mouse cursor. @y: y location of mouse cursor. @device: device id.

Sends a touch up event to the engine.

Definition at line 1215 of file fl_engine.cc.

1220 {
1221 g_return_if_fail(FL_IS_ENGINE(self));
1222
1223 if (self->engine == nullptr) {
1224 return;
1225 }
1226
1227 FlutterPointerEvent event;
1228 event.timestamp = timestamp;
1229 event.x = x;
1230 event.y = y;
1231 event.device_kind = kFlutterPointerDeviceKindTouch;
1232 event.device = device;
1233 event.buttons = 0;
1234 event.view_id = view_id;
1235 event.phase = FlutterPointerPhase::kUp;
1236 event.struct_size = sizeof(event);
1237
1238 if (self->embedder_api.SendPointerEvent(self->engine, &event, 1) !=
1239 kSuccess) {
1240 g_warning("Failed to send pointer event");
1241 }
1242}
@ kUp
Definition embedder.h:1275

References device, kFlutterPointerDeviceKindTouch, kSuccess, kUp, self, FlutterPointerEvent::timestamp, view_id, x, and y.

Referenced by fl_touch_manager_handle_touch_event().

◆ fl_engine_send_window_metrics_event()

void fl_engine_send_window_metrics_event ( FlEngine *  engine,
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 
)

fl_engine_send_window_metrics_event: @engine: an #FlEngine. @display_id: the display this view is rendering on. @view_id: the view that the event occured on. @min_width: minimum width of view in pixels. @min_height: minimum height of view in pixels. @max_width: maximum width of view in pixels. @max_height: maximum height of view in pixels. @pixel_ratio: scale factor for view.

Sends a window metrics event to the engine.

Definition at line 1146 of file fl_engine.cc.

1153 {
1154 g_return_if_fail(FL_IS_ENGINE(self));
1155
1156 if (self->engine == nullptr) {
1157 return;
1158 }
1159
1160 FlutterWindowMetricsEvent event = {};
1161 event.struct_size = sizeof(FlutterWindowMetricsEvent);
1162 event.width = min_width;
1163 event.height = min_height;
1164 event.pixel_ratio = pixel_ratio;
1165 event.display_id = display_id;
1166 event.view_id = view_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) !=
1173 kSuccess) {
1174 g_warning("Failed to send window metrics");
1175 }
1176}

References kSuccess, self, FlutterWindowMetricsEvent::struct_size, and view_id.

Referenced by handle_geometry_changed(), and TEST().

◆ fl_engine_set_implicit_view()

void fl_engine_set_implicit_view ( FlEngine *  engine,
FlRenderable *  renderable 
)

fl_engine_set_implicit_view: @engine: an #FlEngine. @renderable: the object that will render the implicit view.

Sets the object to render the implicit view.

Definition at line 920 of file fl_engine.cc.

920 {
922}
constexpr int64_t kFlutterImplicitViewId
Definition constants.h:35

References flutter::kFlutterImplicitViewId, renderable, self, and set_renderable().

Referenced by fl_view_new(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), and TEST().

◆ fl_engine_set_platform_message_handler()

void fl_engine_set_platform_message_handler ( FlEngine *  engine,
FlEnginePlatformMessageHandler  handler,
gpointer  user_data,
GDestroyNotify  destroy_notify 
)

fl_engine_set_platform_message_handler: @engine: an #FlEngine. @handler: function to call when a platform message is received. @user_data: (closure): user data to pass to @handler. @destroy_notify: (allow-none): a function which gets called to free @user_data, or NULL.

Registers the function called when a platform message is received. Call fl_engine_send_platform_message_response() with the response to this message. Ownership of FlutterPlatformMessageResponseHandle is transferred to the caller, and the message must be responded to avoid memory leaks.

Definition at line 1024 of file fl_engine.cc.

1028 {
1029 g_return_if_fail(FL_IS_ENGINE(self));
1030 g_return_if_fail(handler != nullptr);
1031
1032 if (self->platform_message_handler_destroy_notify) {
1033 self->platform_message_handler_destroy_notify(
1034 self->platform_message_handler_data);
1035 }
1036
1037 self->platform_message_handler = handler;
1038 self->platform_message_handler_data = user_data;
1039 self->platform_message_handler_destroy_notify = destroy_notify;
1040}
const gchar FlBinaryMessengerMessageHandler gpointer GDestroyNotify destroy_notify
const gchar FlBinaryMessengerMessageHandler handler

References destroy_notify, handler, self, and user_data.

Referenced by fl_binary_messenger_new().

◆ fl_engine_set_property()

static void fl_engine_set_property ( GObject *  object,
guint  prop_id,
const GValue *  value,
GParamSpec *  pspec 
)
static

Definition at line 574 of file fl_engine.cc.

577 {
578 FlEngine* self = FL_ENGINE(object);
579 switch (prop_id) {
580 case PROP_BINARY_MESSENGER:
581 g_set_object(&self->binary_messenger,
582 FL_BINARY_MESSENGER(g_value_get_object(value)));
583 break;
584 default:
585 G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
586 break;
587 }
588}
guint const GValue GParamSpec * pspec

References prop_id, pspec, self, and value.

Referenced by fl_engine_class_init().

◆ fl_engine_start()

gboolean fl_engine_start ( FlEngine *  engine,
GError **  error 
)

fl_engine_start: @engine: an #FlEngine. @error: (allow-none): #GError location to store the error occurring, or NULL to ignore. If error is not NULL, *error must be initialized (typically NULL, but an error from a previous call using GLib error handling is explicitly valid).

Starts the Flutter engine.

Returns: TRUE on success.

Definition at line 759 of file fl_engine.cc.

759 {
760 g_return_val_if_fail(FL_IS_ENGINE(self), FALSE);
761
762 FlutterRendererConfig config = {};
763 config.type = self->renderer_type;
764 switch (config.type) {
765 case kSoftware:
767 // No action required, as this is handled in
768 // compositor_present_view_callback.
770 [](void* user_data, const void* allocation, size_t row_bytes,
771 size_t height) { return true; };
772 break;
773 case kOpenGL:
779 // No action required, as this is handled in
780 // compositor_present_view_callback.
781 config.open_gl.present = [](void* user_data) { return true; };
785 break;
786 case kMetal:
787 case kVulkan:
788 default:
790 "Unsupported renderer type");
791 return FALSE;
792 }
793
794 FlutterTaskRunnerDescription platform_task_runner = {};
795 platform_task_runner.struct_size = sizeof(FlutterTaskRunnerDescription);
796 platform_task_runner.user_data = self;
797 platform_task_runner.runs_task_on_current_thread_callback =
799 platform_task_runner.post_task_callback = fl_engine_post_task;
800 platform_task_runner.identifier = kPlatformTaskRunnerIdentifier;
801
802 FlutterCustomTaskRunners custom_task_runners = {};
803 custom_task_runners.struct_size = sizeof(FlutterCustomTaskRunners);
804 custom_task_runners.platform_task_runner = &platform_task_runner;
805
806 switch (fl_dart_project_get_ui_thread_policy(self->project)) {
808 break;
811 custom_task_runners.ui_task_runner = &platform_task_runner;
812 break;
813 }
814
815 g_autoptr(GPtrArray) command_line_args =
816 g_ptr_array_new_with_free_func(g_free);
817 g_ptr_array_insert(command_line_args, 0, g_strdup("flutter"));
818 for (const auto& env_switch : flutter::GetSwitchesFromEnvironment()) {
819 g_ptr_array_add(command_line_args, g_strdup(env_switch.c_str()));
820 }
821 // Linux (and other desktop platforms) always uses SDFs.
822 g_ptr_array_add(command_line_args, g_strdup("--impeller-use-sdfs"));
823
824 gchar** dart_entrypoint_args =
826
829 args.assets_path = fl_dart_project_get_assets_path(self->project);
830 args.icu_data_path = fl_dart_project_get_icu_data_path(self->project);
831 args.command_line_argc = command_line_args->len;
832 args.command_line_argv =
833 reinterpret_cast<const char* const*>(command_line_args->pdata);
834 args.platform_message_callback = fl_engine_platform_message_cb;
835 args.update_semantics_callback2 = fl_engine_update_semantics_cb;
836 args.custom_task_runners = &custom_task_runners;
837 args.shutdown_dart_vm_when_done = true;
838 args.on_pre_engine_restart_callback = fl_engine_on_pre_engine_restart_cb;
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);
844
845 FlutterCompositor compositor = {};
846 compositor.struct_size = sizeof(FlutterCompositor);
847 compositor.user_data = self;
853 args.compositor = &compositor;
854
855 if (self->embedder_api.RunsAOTCompiledDartCode()) {
856 FlutterEngineAOTDataSource source = {};
859 if (self->embedder_api.CreateAOTData(&source, &self->aot_data) !=
860 kSuccess) {
862 "Failed to create AOT data");
863 return FALSE;
864 }
865 args.aot_data = self->aot_data;
866 }
867
868 FlutterEngineResult result = self->embedder_api.Initialize(
869 FLUTTER_ENGINE_VERSION, &config, &args, self, &self->engine);
870 if (result != kSuccess) {
872 "Failed to initialize Flutter engine");
873 return FALSE;
874 }
875
876 result = self->embedder_api.RunInitialized(self->engine);
877 if (result != kSuccess) {
879 "Failed to run Flutter engine");
880 return FALSE;
881 }
882
884
885 g_autoptr(FlSettings) settings = fl_settings_new();
886 self->settings_handler = fl_settings_handler_new(self);
887 fl_settings_handler_start(self->settings_handler, settings);
888
889 self->platform_handler = fl_platform_handler_new(self->binary_messenger);
890
892
893 result = self->embedder_api.UpdateSemanticsEnabled(self->engine, TRUE);
894 if (result != kSuccess) {
895 g_warning("Failed to enable accessibility features on Flutter engine");
896 }
897
898 fl_display_monitor_start(self->display_monitor);
899
900 return TRUE;
901}
@ kFlutterEngineAOTDataSourceTypeElfPath
Definition embedder.h:2466
@ kVulkan
Definition embedder.h:86
@ kMetal
Definition embedder.h:85
#define FLUTTER_ENGINE_VERSION
Definition embedder.h:70
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 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)
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)
Definition fl_engine.cc:434
static bool fl_engine_runs_task_on_current_thread(void *user_data)
Definition fl_engine.cc:475
static void fl_engine_on_pre_engine_restart_cb(void *user_data)
Definition fl_engine.cc:541
static bool compositor_create_backing_store_callback(const FlutterBackingStoreConfig *config, FlutterBackingStore *backing_store_out, void *user_data)
Definition fl_engine.cc:363
static bool fl_engine_gl_make_current(void *user_data)
Definition fl_engine.cc:413
static void * fl_engine_gl_proc_resolver(void *user_data, const char *name)
Definition fl_engine.cc:409
static bool compositor_present_view_callback(const FlutterPresentViewInfo *info)
Definition fl_engine.cc:394
static bool compositor_collect_backing_store_callback(const FlutterBackingStore *backing_store, void *user_data)
Definition fl_engine.cc:379
static void fl_engine_post_task(FlutterTask task, uint64_t target_time_nanos, void *user_data)
Definition fl_engine.cc:481
static uint32_t fl_engine_gl_get_fbo(void *user_data)
Definition fl_engine.cc:423
static void setup_locales(FlEngine *self)
Definition fl_engine.cc:232
static void fl_engine_update_semantics_cb(const FlutterSemanticsUpdate2 *update, void *user_data)
Definition fl_engine.cc:510
static bool fl_engine_gl_make_resource_current(void *user_data)
Definition fl_engine.cc:428
static void fl_engine_platform_message_cb(const FlutterPlatformMessage *message, void *user_data)
Definition fl_engine.cc:490
static constexpr size_t kPlatformTaskRunnerIdentifier
Definition fl_engine.cc:31
static bool fl_engine_gl_clear_current(void *user_data)
Definition fl_engine.cc:418
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args
FlPlatformHandler * fl_platform_handler_new(FlBinaryMessenger *messenger)
FlSettings * fl_settings_new()
void fl_settings_handler_start(FlSettingsHandler *self, FlSettings *settings)
FlSettingsHandler * fl_settings_handler_new(FlEngine *engine)
std::vector< std::string > GetSwitchesFromEnvironment()
FlutterBackingStoreCreateCallback create_backing_store_callback
Definition embedder.h:2251
size_t struct_size
This size of this struct. Must be sizeof(FlutterCompositor).
Definition embedder.h:2235
FlutterPresentViewCallback present_view_callback
Definition embedder.h:2288
FlutterBackingStoreCollectCallback collect_backing_store_callback
Definition embedder.h:2256
const FlutterTaskRunnerDescription * ui_task_runner
Definition embedder.h:1946
const FlutterTaskRunnerDescription * platform_task_runner
Definition embedder.h:1934
size_t struct_size
The size of this struct. Must be sizeof(FlutterCustomTaskRunners).
Definition embedder.h:1929
FlutterEngineAOTDataSourceType type
Definition embedder.h:2472
const char * elf_path
Absolute path to an ELF library file.
Definition embedder.h:2475
ProcResolver gl_proc_resolver
Definition embedder.h:765
size_t struct_size
The size of this struct. Must be sizeof(FlutterOpenGLRendererConfig).
Definition embedder.h:726
TextureFrameCallback gl_external_texture_frame_callback
Definition embedder.h:770
BoolCallback make_resource_current
Definition embedder.h:748
size_t struct_size
The size of this struct. Must be sizeof(FlutterProjectArgs).
Definition embedder.h:2496
FlutterSoftwareRendererConfig software
Definition embedder.h:1041
FlutterOpenGLRendererConfig open_gl
Definition embedder.h:1040
FlutterRendererType type
Definition embedder.h:1038
size_t struct_size
The size of this struct. Must be sizeof(FlutterSoftwareRendererConfig).
Definition embedder.h:1029
SoftwareSurfacePresentCallback surface_present_callback
Definition embedder.h:1034
size_t struct_size
The size of this struct. Must be sizeof(FlutterTaskRunnerDescription).
Definition embedder.h:1902
BoolCallback runs_task_on_current_thread_callback
Definition embedder.h:1908
FlutterTaskRunnerPostTaskCallback post_task_callback
Definition embedder.h:1919

References args, FlutterOpenGLRendererConfig::clear_current, FlutterCompositor::collect_backing_store_callback, compositor_collect_backing_store_callback(), compositor_create_backing_store_callback(), compositor_present_view_callback(), FlutterCompositor::create_backing_store_callback, FlutterEngineAOTDataSource::elf_path, error, FlutterOpenGLRendererConfig::fbo_callback, fl_dart_project_get_aot_library_path(), fl_dart_project_get_assets_path(), fl_dart_project_get_dart_entrypoint_arguments(), fl_dart_project_get_icu_data_path(), fl_dart_project_get_ui_thread_policy(), fl_display_monitor_start(), FL_ENGINE_ERROR_FAILED, fl_engine_error_quark(), fl_engine_gl_clear_current(), fl_engine_gl_external_texture_frame_callback(), fl_engine_gl_get_fbo(), fl_engine_gl_make_current(), fl_engine_gl_make_resource_current(), fl_engine_gl_proc_resolver(), fl_engine_on_pre_engine_restart_cb(), fl_engine_platform_message_cb(), fl_engine_post_task(), fl_engine_runs_task_on_current_thread(), fl_engine_update_semantics_cb(), fl_platform_handler_new(), fl_settings_handler_new(), fl_settings_handler_start(), fl_settings_new(), FL_UI_THREAD_POLICY_DEFAULT, FL_UI_THREAD_POLICY_RUN_ON_PLATFORM_THREAD, FL_UI_THREAD_POLICY_RUN_ON_SEPARATE_THREAD, FLUTTER_ENGINE_VERSION, g_autoptr(), flutter::GetSwitchesFromEnvironment(), FlutterOpenGLRendererConfig::gl_external_texture_frame_callback, FlutterOpenGLRendererConfig::gl_proc_resolver, height, FlutterTaskRunnerDescription::identifier, kFlutterEngineAOTDataSourceTypeElfPath, kMetal, kOpenGL, kPlatformTaskRunnerIdentifier, kSoftware, kSuccess, kVulkan, FlutterOpenGLRendererConfig::make_current, FlutterOpenGLRendererConfig::make_resource_current, FlutterRendererConfig::open_gl, FlutterCustomTaskRunners::platform_task_runner, FlutterTaskRunnerDescription::post_task_callback, FlutterOpenGLRendererConfig::present, FlutterCompositor::present_view_callback, FlutterTaskRunnerDescription::runs_task_on_current_thread_callback, self, setup_keyboard(), setup_locales(), FlutterRendererConfig::software, FlutterOpenGLRendererConfig::struct_size, FlutterSoftwareRendererConfig::struct_size, FlutterTaskRunnerDescription::struct_size, FlutterCustomTaskRunners::struct_size, FlutterCompositor::struct_size, FlutterProjectArgs::struct_size, FlutterSoftwareRendererConfig::surface_present_callback, TRUE, FlutterRendererConfig::type, FlutterEngineAOTDataSource::type, FlutterCustomTaskRunners::ui_task_runner, user_data, FlutterTaskRunnerDescription::user_data, and FlutterCompositor::user_data.

Referenced by realize_cb(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), TEST(), and TEST().

◆ fl_engine_unregister_external_texture()

gboolean fl_engine_unregister_external_texture ( FlEngine *  engine,
int64_t  texture_id 
)

fl_engine_unregister_external_texture: @engine: an #FlEngine. @texture_id: the identifier of the texture that is not available anymore.

Tells the Flutter engine that an existing external texture is not available anymore.

Returns: TRUE on success.

Definition at line 1486 of file fl_engine.cc.

1487 {
1488 g_return_val_if_fail(FL_IS_ENGINE(self), FALSE);
1489 return self->embedder_api.UnregisterExternalTexture(self->engine,
1490 texture_id) == kSuccess;
1491}

References kSuccess, self, and texture_id.

Referenced by unregister_texture().

◆ fl_engine_update_accessibility_features()

void fl_engine_update_accessibility_features ( FlEngine *  engine,
int32_t  flags 
)

fl_engine_update_accessibility_features: @engine: an #FlEngine. @flags: the features to enable in the accessibility tree.

Tells the Flutter engine to update the flags on the accessibility tree.

Definition at line 1517 of file fl_engine.cc.

1517 {
1518 g_return_if_fail(FL_IS_ENGINE(self));
1519
1520 if (self->engine == nullptr) {
1521 return;
1522 }
1523
1524 if (self->embedder_api.UpdateAccessibilityFeatures(
1525 self->engine, static_cast<FlutterAccessibilityFeature>(flags)) !=
1526 kSuccess) {
1527 g_warning("Failed to update accessibility features");
1528 }
1529}
FlutterAccessibilityFeature
Definition embedder.h:91

References kSuccess, and self.

Referenced by update_settings().

◆ fl_engine_update_semantics_cb()

static void fl_engine_update_semantics_cb ( const FlutterSemanticsUpdate2 update,
void *  user_data 
)
static

Definition at line 510 of file fl_engine.cc.

511 {
512 FlEngine* self = FL_ENGINE(user_data);
513
514 g_signal_emit(self, fl_engine_signals[SIGNAL_UPDATE_SEMANTICS], 0, update);
515}

References fl_engine_signals, self, SIGNAL_UPDATE_SEMANTICS, and user_data.

Referenced by fl_engine_start().

◆ free_locale()

static void free_locale ( FlutterLocale locale)
static

Definition at line 225 of file fl_engine.cc.

225 {
226 g_free(const_cast<gchar*>(locale->language_code));
227 g_free(const_cast<gchar*>(locale->country_code));
228 g_free(locale);
229}
const char * language_code
Definition embedder.h:2297
const char * country_code
Definition embedder.h:2302

References FlutterLocale::country_code, and FlutterLocale::language_code.

Referenced by setup_locales().

◆ G_DEFINE_TYPE_WITH_CODE()

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  
)

Definition at line 121 of file fl_engine.cc.

128 { PROP_0, PROP_BINARY_MESSENGER, PROP_LAST };
@ PROP_LAST

References PROP_0, and PROP_LAST.

◆ get_renderable()

static FlRenderable * get_renderable ( FlEngine *  self,
int64_t  view_id 
)
static

Returns the renderable with the given ID, or nullptr if no such view exists. Returns a reference to the renderable.

Definition at line 187 of file fl_engine.cc.

187 {
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) {
192 return nullptr;
193 }
194 return FL_RENDERABLE(g_weak_ref_get(ref));
195}

References g_autoptr(), self, and view_id.

Referenced by compositor_present_view_callback(), and fl_engine_get_renderable().

◆ parse_locale()

static void parse_locale ( const gchar *  locale,
gchar **  language,
gchar **  territory,
gchar **  codeset,
gchar **  modifier 
)
static

Definition at line 131 of file fl_engine.cc.

135 {
136 gchar* l = g_strdup(locale);
137
138 // Locales are in the form "language[_territory][.codeset][@modifier]"
139 gchar* match = strrchr(l, '@');
140 if (match != nullptr) {
141 if (modifier != nullptr) {
142 *modifier = g_strdup(match + 1);
143 }
144 *match = '\0';
145 } else if (modifier != nullptr) {
146 *modifier = nullptr;
147 }
148
149 match = strrchr(l, '.');
150 if (match != nullptr) {
151 if (codeset != nullptr) {
152 *codeset = g_strdup(match + 1);
153 }
154 *match = '\0';
155 } else if (codeset != nullptr) {
156 *codeset = nullptr;
157 }
158
159 match = strrchr(l, '_');
160 if (match != nullptr) {
161 if (territory != nullptr) {
162 *territory = g_strdup(match + 1);
163 }
164 *match = '\0';
165 } else if (territory != nullptr) {
166 *territory = nullptr;
167 }
168
169 if (language != nullptr) {
170 *language = l;
171 }
172}

Referenced by setup_locales().

◆ remove_renderable()

static void remove_renderable ( FlEngine *  self,
int64_t  view_id 
)
static

Remove a renderable that no longer exists.

Definition at line 198 of file fl_engine.cc.

198 {
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));
201}

References g_autoptr(), self, and view_id.

Referenced by fl_engine_remove_view().

◆ send_key_event_cb()

static void send_key_event_cb ( bool  handled,
void *  user_data 
)
static

Definition at line 1395 of file fl_engine.cc.

1395 {
1396 g_autoptr(GTask) task = G_TASK(user_data);
1397 gboolean* return_value = g_new0(gboolean, 1);
1398 *return_value = handled;
1399 g_task_return_pointer(task, return_value, g_free);
1400}

References g_autoptr(), and user_data.

Referenced by fl_engine_send_key_event().

◆ set_renderable()

static void set_renderable ( FlEngine *  self,
int64_t  view_id,
FlRenderable *  renderable 
)
static

Stores a weak reference to the renderable with the given ID.

Definition at line 175 of file fl_engine.cc.

177 {
178 g_autoptr(GMutexLocker) locker = g_mutex_locker_new(&self->renderables_mutex);
179 GWeakRef* ref = g_new(GWeakRef, 1);
180 g_weak_ref_init(ref, G_OBJECT(renderable));
181 g_hash_table_insert(self->renderables_by_view_id, GINT_TO_POINTER(view_id),
182 ref);
183}
g_hash_table_insert(self->handlers, g_strdup(channel), handler_new(handler, user_data, destroy_notify))

References g_autoptr(), g_hash_table_insert(), renderable, self, and view_id.

Referenced by fl_engine_add_view(), and fl_engine_set_implicit_view().

◆ setup_keyboard()

static void setup_keyboard ( FlEngine *  self)
static

Definition at line 517 of file fl_engine.cc.

517 {
518 g_clear_object(&self->keyboard_manager);
519 self->keyboard_manager = fl_keyboard_manager_new(self);
520
521 g_clear_object(&self->keyboard_handler);
522 self->keyboard_handler =
523 fl_keyboard_handler_new(self->binary_messenger, self->keyboard_manager);
524
525 GtkWidget* widget =
526 self->text_input_handler != nullptr
527 ? fl_text_input_handler_get_widget(self->text_input_handler)
528 : nullptr;
529 g_clear_object(&self->text_input_handler);
530 self->text_input_handler = fl_text_input_handler_new(self->binary_messenger);
531 if (widget != nullptr) {
532 fl_text_input_handler_set_widget(self->text_input_handler, widget);
533 }
534}
FlKeyboardHandler * fl_keyboard_handler_new(FlBinaryMessenger *messenger, FlKeyboardManager *keyboard_manager)
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)

References fl_keyboard_handler_new(), fl_keyboard_manager_new(), fl_text_input_handler_get_widget(), fl_text_input_handler_new(), fl_text_input_handler_set_widget(), and self.

Referenced by fl_engine_on_pre_engine_restart_cb(), and fl_engine_start().

◆ setup_locales()

static void setup_locales ( FlEngine *  self)
static

Definition at line 232 of file fl_engine.cc.

232 {
233 const gchar* const* languages = g_get_language_names();
234 g_autoptr(GPtrArray) locales_array = g_ptr_array_new_with_free_func(
235 reinterpret_cast<GDestroyNotify>(free_locale));
236 for (int i = 0; languages[i] != nullptr; i++) {
237 g_autofree gchar* locale_string = g_strstrip(g_strdup(languages[i]));
238
239 // Ignore empty locales, caused by settings like `LANGUAGE=pt_BR:`
240 if (strcmp(locale_string, "") == 0) {
241 continue;
242 }
243
244 g_autofree gchar* language = nullptr;
245 g_autofree gchar* territory = nullptr;
246 parse_locale(locale_string, &language, &territory, nullptr, nullptr);
247
248 // Ignore duplicate locales, caused by settings like `LANGUAGE=C` (returns
249 // two "C") or `LANGUAGE=en:en`
250 gboolean has_locale = FALSE;
251 for (guint j = 0; !has_locale && j < locales_array->len; j++) {
252 FlutterLocale* locale =
253 reinterpret_cast<FlutterLocale*>(g_ptr_array_index(locales_array, j));
254 has_locale = g_strcmp0(locale->language_code, language) == 0 &&
255 g_strcmp0(locale->country_code, territory) == 0;
256 }
257 if (has_locale) {
258 continue;
259 }
260
261 FlutterLocale* locale =
262 static_cast<FlutterLocale*>(g_malloc0(sizeof(FlutterLocale)));
263 g_ptr_array_add(locales_array, locale);
264 locale->struct_size = sizeof(FlutterLocale);
265 locale->language_code =
266 reinterpret_cast<const gchar*>(g_steal_pointer(&language));
267 locale->country_code =
268 reinterpret_cast<const gchar*>(g_steal_pointer(&territory));
269 locale->script_code = nullptr;
270 locale->variant_code = nullptr;
271 }
272 FlutterLocale** locales =
273 reinterpret_cast<FlutterLocale**>(locales_array->pdata);
274 FlutterEngineResult result = self->embedder_api.UpdateLocales(
275 self->engine, const_cast<const FlutterLocale**>(locales),
276 locales_array->len);
277 if (result != kSuccess) {
278 g_warning("Failed to set up Flutter locales");
279 }
280}
static void parse_locale(const gchar *locale, gchar **language, gchar **territory, gchar **codeset, gchar **modifier)
Definition fl_engine.cc:131
static void free_locale(FlutterLocale *locale)
Definition fl_engine.cc:225
size_t struct_size
This size of this struct. Must be sizeof(FlutterLocale).
Definition embedder.h:2293
const char * script_code
Definition embedder.h:2307
const char * variant_code
Definition embedder.h:2312

References FlutterLocale::country_code, free_locale(), g_autoptr(), i, kSuccess, FlutterLocale::language_code, parse_locale(), FlutterLocale::script_code, self, FlutterLocale::struct_size, and FlutterLocale::variant_code.

Referenced by fl_engine_start().

◆ view_added_cb()

static void view_added_cb ( const FlutterAddViewResult result)
static

Definition at line 203 of file fl_engine.cc.

203 {
204 g_autoptr(GTask) task = G_TASK(result->user_data);
205
206 if (result->added) {
207 g_task_return_boolean(task, TRUE);
208 } else {
209 g_task_return_new_error(task, fl_engine_error_quark(),
210 FL_ENGINE_ERROR_FAILED, "Failed to add view");
211 }
212}
void * user_data
The |FlutterAddViewInfo.user_data|.
Definition embedder.h:1111
bool added
True if the add view operation succeeded.
Definition embedder.h:1108

References FlutterAddViewResult::added, FL_ENGINE_ERROR_FAILED, fl_engine_error_quark(), g_autoptr(), TRUE, and FlutterAddViewResult::user_data.

Referenced by fl_engine_add_view().

◆ view_removed_cb()

static void view_removed_cb ( const FlutterRemoveViewResult result)
static

Definition at line 214 of file fl_engine.cc.

214 {
215 g_autoptr(GTask) task = G_TASK(result->user_data);
216
217 if (result->removed) {
218 g_task_return_boolean(task, TRUE);
219 } else {
220 g_task_return_new_error(task, fl_engine_error_quark(),
221 FL_ENGINE_ERROR_FAILED, "Failed to remove view");
222 }
223}
void * user_data
The |FlutterRemoveViewInfo.user_data|.
Definition embedder.h:1159
bool removed
True if the remove view operation succeeded.
Definition embedder.h:1156

References FL_ENGINE_ERROR_FAILED, fl_engine_error_quark(), g_autoptr(), FlutterRemoveViewResult::removed, TRUE, and FlutterRemoveViewResult::user_data.

Referenced by fl_engine_remove_view().

Variable Documentation

◆ fl_engine_signals

guint fl_engine_signals[LAST_SIGNAL]
static

◆ kMousePointerDeviceId

constexpr int32_t kMousePointerDeviceId = 0
staticconstexpr

Definition at line 35 of file fl_engine.cc.

Referenced by fl_engine_send_mouse_pointer_event().

◆ kPlatformTaskRunnerIdentifier

constexpr size_t kPlatformTaskRunnerIdentifier = 1
staticconstexpr

Definition at line 31 of file fl_engine.cc.

Referenced by fl_engine_start().

◆ kPointerPanZoomDeviceId

constexpr int32_t kPointerPanZoomDeviceId = 1
staticconstexpr

Definition at line 36 of file fl_engine.cc.

Referenced by fl_engine_send_pointer_pan_zoom_event().