Flutter Windows Embedder
flutter_engine.cc
Go to the documentation of this file.
1 // Copyright 2013 The Flutter Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
6 
7 #include <algorithm>
8 #include <iostream>
9 
10 #include "binary_messenger_impl.h"
11 #include "flutter_windows.h"
12 
13 namespace flutter {
14 
16  FlutterDesktopEngineProperties c_engine_properties = {};
17  c_engine_properties.assets_path = project.assets_path().c_str();
18  c_engine_properties.icu_data_path = project.icu_data_path().c_str();
19  c_engine_properties.aot_library_path = project.aot_library_path().c_str();
20  c_engine_properties.dart_entrypoint = project.dart_entrypoint().c_str();
21  c_engine_properties.gpu_preference =
22  static_cast<FlutterDesktopGpuPreference>(project.gpu_preference());
23  c_engine_properties.ui_thread_policy =
24  static_cast<FlutterDesktopUIThreadPolicy>(project.ui_thread_policy());
25  c_engine_properties.accessibility_mode =
27  project.accessibility_mode());
28  c_engine_properties.impeller_switch =
29  static_cast<FlutterDesktopImpellerSwitch>(project.impeller_switch());
30 
31  const std::vector<std::string>& entrypoint_args =
32  project.dart_entrypoint_arguments();
33  std::vector<const char*> entrypoint_argv;
34  std::transform(
35  entrypoint_args.begin(), entrypoint_args.end(),
36  std::back_inserter(entrypoint_argv),
37  [](const std::string& arg) -> const char* { return arg.c_str(); });
38 
39  c_engine_properties.dart_entrypoint_argc =
40  static_cast<int>(entrypoint_argv.size());
41  c_engine_properties.dart_entrypoint_argv =
42  entrypoint_argv.empty() ? nullptr : entrypoint_argv.data();
43 
44  engine_ = FlutterDesktopEngineCreate(&c_engine_properties);
45 
46  auto core_messenger = FlutterDesktopEngineGetMessenger(engine_);
47  messenger_ = std::make_unique<BinaryMessengerImpl>(core_messenger);
48 }
49 
51  ShutDown();
52 }
53 
55  return Run(nullptr);
56 }
57 
58 bool FlutterEngine::Run(const char* entry_point) {
59  if (!engine_) {
60  std::cerr << "Cannot run an engine that failed creation." << std::endl;
61  return false;
62  }
63  if (run_succeeded_) {
64  std::cerr << "Cannot run an engine more than once." << std::endl;
65  return false;
66  }
67  bool run_succeeded = FlutterDesktopEngineRun(engine_, entry_point);
68  if (!run_succeeded) {
69  std::cerr << "Failed to start engine." << std::endl;
70  }
71  run_succeeded_ = true;
72  return run_succeeded;
73 }
74 
76  if (engine_ && owns_engine_) {
78  }
79  engine_ = nullptr;
80 }
81 
82 std::chrono::nanoseconds FlutterEngine::ProcessMessages() {
83  return std::chrono::nanoseconds(FlutterDesktopEngineProcessMessages(engine_));
84 }
85 
88 }
89 
91  const std::string& plugin_name) {
92  if (!engine_) {
93  std::cerr << "Cannot get plugin registrar on an engine that isn't running; "
94  "call Run first."
95  << std::endl;
96  return nullptr;
97  }
98  return FlutterDesktopEngineGetPluginRegistrar(engine_, plugin_name.c_str());
99 }
100 
101 void FlutterEngine::SetNextFrameCallback(std::function<void()> callback) {
102  next_frame_callback_ = std::move(callback);
104  engine_,
105  [](void* user_data) {
106  FlutterEngine* self = static_cast<FlutterEngine*>(user_data);
107  self->next_frame_callback_();
108  self->next_frame_callback_ = nullptr;
109  },
110  this);
111 }
112 
114  if (!engine_) {
115  std::cerr
116  << "Cannot check platform thread on an engine that failed creation."
117  << std::endl;
118  return false;
119  }
120  return FlutterDesktopEngineIsPlatformThread(engine_);
121 }
122 
123 void FlutterEngine::PostPlatformThreadTask(std::function<void()> callback) {
124  if (!callback) {
125  return;
126  }
128  engine_,
129  /*callback=*/
130  [](void* user_data) {
131  std::unique_ptr<std::function<void()>> cb{
132  static_cast<std::function<void()>*>(user_data)};
133  (*cb)();
134  },
135  /*on_cancel=*/
136  [](void* user_data) {
137  delete static_cast<std::function<void()>*>(user_data);
138  },
139  /*user_data=*/new std::function<void()>(std::move(callback)));
140 }
141 
143  HWND hwnd,
144  UINT message,
145  WPARAM wparam,
146  LPARAM lparam) {
147  LRESULT result;
149  engine_, hwnd, message, wparam, lparam, &result)) {
150  return result;
151  }
152  return std::nullopt;
153 }
154 
155 FlutterDesktopEngineRef FlutterEngine::RelinquishEngine() {
156  owns_engine_ = false;
157  return engine_;
158 }
159 
160 } // namespace flutter
AccessibilityMode accessibility_mode() const
Definition: dart_project.h:145
UIThreadPolicy ui_thread_policy() const
Definition: dart_project.h:136
const std::string & dart_entrypoint() const
Definition: dart_project.h:106
const std::vector< std::string > & dart_entrypoint_arguments() const
Definition: dart_project.h:116
GpuPreference gpu_preference() const
Definition: dart_project.h:127
ImpellerSwitch impeller_switch() const
Definition: dart_project.h:154
std::optional< LRESULT > ProcessExternalWindowMessage(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
std::chrono::nanoseconds ProcessMessages()
FlutterDesktopPluginRegistrarRef GetRegistrarForPlugin(const std::string &plugin_name) override
void PostPlatformThreadTask(std::function< void()> callback)
bool IsPlatformThread() const
FlutterEngine(const DartProject &project)
void SetNextFrameCallback(std::function< void()> callback)
FlutterDesktopEngineRef FlutterDesktopEngineCreate(const FlutterDesktopEngineProperties *engine_properties)
void FlutterDesktopEngineReloadSystemFonts(FlutterDesktopEngineRef engine)
bool FlutterDesktopEngineProcessExternalWindowMessage(FlutterDesktopEngineRef engine, HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam, LRESULT *result)
FlutterDesktopPluginRegistrarRef FlutterDesktopEngineGetPluginRegistrar(FlutterDesktopEngineRef engine, const char *plugin_name)
bool FlutterDesktopEngineIsPlatformThread(FlutterDesktopEngineRef engine)
bool FlutterDesktopEngineDestroy(FlutterDesktopEngineRef engine_ref)
void FlutterDesktopEnginePostPlatformThreadTask(FlutterDesktopEngineRef engine, VoidCallback callback, VoidCallback on_cancel, void *user_data)
uint64_t FlutterDesktopEngineProcessMessages(FlutterDesktopEngineRef engine)
FlutterDesktopMessengerRef FlutterDesktopEngineGetMessenger(FlutterDesktopEngineRef engine)
void FlutterDesktopEngineSetNextFrameCallback(FlutterDesktopEngineRef engine, VoidCallback callback, void *user_data)
bool FlutterDesktopEngineRun(FlutterDesktopEngineRef engine, const char *entry_point)
struct FlutterDesktopEngine * FlutterDesktopEngineRef
FlutterDesktopUIThreadPolicy
FlutterDesktopGpuPreference
FlutterDesktopImpellerSwitch
FlutterDesktopAccessibilityMode
FlutterDesktopBinaryReply callback
Win32Message message
FlutterDesktopAccessibilityMode accessibility_mode
FlutterDesktopImpellerSwitch impeller_switch
FlutterDesktopUIThreadPolicy ui_thread_policy
FlutterDesktopGpuPreference gpu_preference