1717#include " flutter/shell/platform/linux/fl_settings_plugin.h"
1818#include " flutter/shell/platform/linux/public/flutter_linux/fl_plugin_registry.h"
1919
20- static constexpr int kMicrosecondsPerNanosecond = 1000 ;
21-
2220// Unique number associated with platform tasks.
2321static constexpr size_t kPlatformTaskRunnerIdentifier = 1 ;
2422
@@ -32,6 +30,7 @@ struct _FlEngine {
3230 FlRenderer* renderer;
3331 FlBinaryMessenger* binary_messenger;
3432 FlSettingsPlugin* settings_plugin;
33+ FlTaskRunner* task_runner;
3534 FlutterEngineAOTData aot_data;
3635 FLUTTER_API_SYMBOL (FlutterEngine) engine;
3736 FlutterEngineProcTable embedder_api;
@@ -59,13 +58,6 @@ G_DEFINE_TYPE_WITH_CODE(
5958 G_IMPLEMENT_INTERFACE (fl_plugin_registry_get_type(),
6059 fl_engine_plugin_registry_iface_init))
6160
62- // Subclass of GSource that integrates Flutter tasks into the GLib main loop.
63- typedef struct {
64- GSource parent;
65- FlEngine* engine;
66- FlutterTask task;
67- } FlutterSource;
68-
6961// Parse a locale into its components.
7062static void parse_locale(const gchar* locale,
7163 gchar** language,
@@ -143,40 +135,6 @@ static void setup_locales(FlEngine* self) {
143135 }
144136}
145137
146- // Callback to run a Flutter task in the GLib main loop.
147- static gboolean flutter_source_dispatch (GSource* source,
148- GSourceFunc callback,
149- gpointer user_data) {
150- FlutterSource* fl_source = reinterpret_cast <FlutterSource*>(source);
151- FlEngine* self = fl_source->engine ;
152-
153- FlutterEngineResult result =
154- self->embedder_api .RunTask (self->engine , &fl_source->task );
155- if (result != kSuccess ) {
156- g_warning (" Failed to run Flutter task\n " );
157- }
158-
159- return G_SOURCE_REMOVE;
160- }
161-
162- // Called when the engine is disposed.
163- static void engine_weak_notify_cb (gpointer user_data,
164- GObject* where_the_object_was) {
165- FlutterSource* source = reinterpret_cast <FlutterSource*>(user_data);
166- source->engine = nullptr ;
167- g_source_destroy (reinterpret_cast <GSource*>(source));
168- }
169-
170- // Called when a flutter source completes.
171- static void flutter_source_finalize (GSource* source) {
172- FlutterSource* fl_source = reinterpret_cast <FlutterSource*>(source);
173- if (fl_source->engine != nullptr ) {
174- g_object_weak_unref (G_OBJECT (fl_source->engine ), engine_weak_notify_cb,
175- fl_source);
176- fl_source->engine = nullptr ;
177- }
178- }
179-
180138// Called when engine needs a backing store for a specific #FlutterLayer.
181139static bool compositor_create_backing_store_callback (
182140 const FlutterBackingStoreConfig* config,
@@ -204,16 +162,6 @@ static bool compositor_present_layers_callback(const FlutterLayer** layers,
204162 layers_count);
205163}
206164
207- // Table of functions for Flutter GLib main loop integration.
208- static GSourceFuncs flutter_source_funcs = {
209- nullptr , // prepare
210- nullptr , // check
211- flutter_source_dispatch, // dispatch
212- flutter_source_finalize, // finalize
213- nullptr ,
214- nullptr // Internal usage
215- };
216-
217165// Flutter engine rendering callbacks.
218166
219167static void * fl_engine_gl_proc_resolver (void * user_data, const char * name) {
@@ -278,15 +226,7 @@ static void fl_engine_post_task(FlutterTask task,
278226 void * user_data) {
279227 FlEngine* self = static_cast <FlEngine*>(user_data);
280228
281- g_autoptr (GSource) source =
282- g_source_new (&flutter_source_funcs, sizeof (FlutterSource));
283- FlutterSource* fl_source = reinterpret_cast <FlutterSource*>(source);
284- fl_source->engine = self;
285- g_object_weak_ref (G_OBJECT (self), engine_weak_notify_cb, fl_source);
286- fl_source->task = task;
287- g_source_set_ready_time (source,
288- target_time_nanos / kMicrosecondsPerNanosecond );
289- g_source_attach (source, nullptr );
229+ fl_task_runner_post_task (self->task_runner , task, target_time_nanos);
290230}
291231
292232// Called when a platform message is received from the engine.
@@ -361,6 +301,7 @@ static void fl_engine_dispose(GObject* object) {
361301 g_clear_object (&self->renderer );
362302 g_clear_object (&self->binary_messenger );
363303 g_clear_object (&self->settings_plugin );
304+ g_clear_object (&self->task_runner );
364305
365306 if (self->platform_message_handler_destroy_notify ) {
366307 self->platform_message_handler_destroy_notify (
@@ -410,6 +351,8 @@ G_MODULE_EXPORT FlEngine* fl_engine_new_headless(FlDartProject* project) {
410351gboolean fl_engine_start (FlEngine* self, GError** error) {
411352 g_return_val_if_fail (FL_IS_ENGINE (self), FALSE );
412353
354+ self->task_runner = fl_task_runner_new (self);
355+
413356 FlutterRendererConfig config = {};
414357 config.type = kOpenGL ;
415358 config.open_gl .struct_size = sizeof (FlutterOpenGLRendererConfig);
@@ -722,3 +665,13 @@ G_MODULE_EXPORT FlBinaryMessenger* fl_engine_get_binary_messenger(
722665 g_return_val_if_fail (FL_IS_ENGINE (self), nullptr );
723666 return self->binary_messenger ;
724667}
668+
669+ FlTaskRunner* fl_engine_get_task_runner (FlEngine* self) {
670+ g_return_val_if_fail (FL_IS_ENGINE (self), nullptr );
671+ return self->task_runner ;
672+ }
673+
674+ void fl_engine_execute_task (FlEngine* self, FlutterTask* task) {
675+ g_return_if_fail (FL_IS_ENGINE (self));
676+ self->embedder_api .RunTask (self->engine , task);
677+ }
0 commit comments